Javascript 在for-in循环中的特定数组属性上使用JS Array.Reduce
我尝试使用Javascript 在for-in循环中的特定数组属性上使用JS Array.Reduce,javascript,arrays,qt,qml,Javascript,Arrays,Qt,Qml,我尝试使用数组的组合。在循环数据时减少,以提供将数组中的值相加的结果,但仅当它们还具有另一个匹配属性时,我的数组示例为: {"2018":[{"leaveYear":2018,"dayValue":60},{"leaveYear":2018,"dayValue":60}], "2019":[{"leaveYear":2019,"dayValue":60}]} 对于上面的示例,我想做的是获取每个dayValue的总和,但仅当它们的leaveYear匹配时。所以我的结果是: 2018:120 20
数组的组合。在循环数据时减少,以提供将数组中的值相加的结果,但仅当它们还具有另一个匹配属性时,我的数组示例为:
{"2018":[{"leaveYear":2018,"dayValue":60},{"leaveYear":2018,"dayValue":60}], "2019":[{"leaveYear":2019,"dayValue":60}]}
对于上面的示例,我想做的是获取每个dayValue
的总和,但仅当它们的leaveYear
匹配时。所以我的结果是:
2018:120
2019:60
然后,这些数据将存储在我的数据库中,leaveYear
作为键,减少的dayValue
作为值
我的进步
我首先创建了新数组,该数组按leaveYear
对数组对象进行分组,因为它们可以是任意年份,也可以是函数的任意顺序:
function getSum(total, num) {
return total + num;
}
//used to total my values
function groupBy(array, property) {
var hash = {};
for (var i = 0; i < array.length; i++) {
if (!hash[array[i][property]]) hash[array[i][property]] = [];
hash[array[i][property]].push(array[i]);
}
return hash;
}
我的问题是
执行此操作时,有时效果很好,但当添加更多数组对象或几个leaveYear
时,循环有时似乎会跳过或错过数字,只会减少给定leaveYear
如何在数组的每个leaveYear
上循环,以减少信号并将其发送到数据库,然后再移动到下一组值
谢谢你的帮助 您的输入是一个值为数组的对象,您需要为原始对象中的每个键值对创建一个新对象。您可以通过.map
将每个内部数组ping到一个条目,使用对数组中每个项目的日值进行求和
,然后使用对象转换回一个对象。fromEntries
:
const输入={
"2018": [{
“离职年度”:2018年,
“日价值”:60
}, {
“离职年度”:2018年,
“日价值”:60
}],
"2019": [{
“离职年份”:2019年,
“日价值”:60
}]
};
const sumDays=yearr=>yearr.reduce((a,b)=>a+b.dayValue,0);
常量输出=Object.fromEntries(
Object.values(input.map(yearr=>([yearr[0].leaveYear,sumDays(yearr)])
);
控制台日志(输出)
感谢您的回答,我无法使用箭头功能=>
,我正在Felgo
中构建我的应用程序,以前是V-Play
,目前正在尝试调整此功能以开始工作(箭头功能不是很好),一旦完成,我将标记为已回答!我正在处理reduce
建议,而不是fromEntries
!万分感谢!一般来说,最好使用最新和最好的语言版本编写,然后使用类似的工具自动向下传输以实现ES5兼容性。这使您可以编写简洁明了的代码,同时仍然允许过时的浏览器理解它;var output=Object.values(input).reduce(函数(a,yearr){a[yearr[0].leaveYear]=sumDays(yearr);返回a;},{})代码>巴贝尔…我刚刚发现了一些惊人的事情。谢谢你的提示!对我来说,它绝对更具可读性——写新的然后写下来是有意义的!请注意,Felgo并没有阻止您使用arrow函数,您只需要Qt5.12或更高版本
var grouped = groupBy(multiSelectSaveArr,'leaveYear')
var multiDeductTotal = []
// my array of arrays by leaveYear
for(var i in grouped) {
var splitGroup = grouped[i]
console.log("SPLITGROUP:" + JSON.stringify(splitGroup))
//my log shows the result of
//SPLITGROUP:[{"leaveYear":2018,"dayValue":60},{"leaveYear":2018,"dayValue":60}]
//SPLITGROUP:[{"leaveYear":2019,"dayValue":60}]
//I then loop through splitGroup to reduce for my desired result by doing the following:
for(var ix in splitGroup) {
multiDeductTotal.push([splitGroup[ix].dayValue])
}
var deductReduce = 0 + multiDeductTotal.reduce(getSum)
//signal to database storing data
calendarPage.amendTakenAllowance(deductReduce, year)
}