[英]loop through the objects inside the array and sum it up
I have a an array consist of datas , where each datas has multiple subDatas, 我有一个由数据组成的数组,其中每个数据都有多个subData,
var res = [
{
data1:{subData1:56, subData2:0, subData3:45},
data2:{subData2:565, subData3:67, subData4:45},
data3:{subData1:45, subData3:0},
data4:{subData1:32, subData2:0, subData3:47},
data5:{subData1:107, subData2:34, subData3:65},
data6:{subData3:123, subData4:43},
data7:{subData1:432, subData2:67, subData3:78},
data8:{subData4:23, subData5:432, subData6:654},
}
];
i need to get the sum of each subDatas in an array, i have figured out the solution but how can i reduce the code . 我需要获取数组中每个subDatas的总和,我已经找到了解决方案,但是如何减少代码。 Please find the below code for solving and suggest a better optimized way.
请找到以下代码以解决问题,并提出一种更好的优化方法。 I am using underscore js too.
我也使用下划线js。
var res = [ { data1:{subData1:56, subData2:0, subData3:45}, data2:{subData2:565, subData3:67, subData4:45}, data3:{subData1:45, subData3:0}, data4:{subData1:32, subData2:0, subData3:47}, data5:{subData1:107, subData2:34, subData3:65}, data6:{subData3:123, subData4:43}, data7:{subData1:432, subData2:67, subData3:78}, data8:{subData4:23, subData5:432, subData6:654}, } ]; var values = Object.values(res[0]) var arrayOfItems = []; var sums = {}; values.map(obj => Object.keys(obj)).map(item => {item.map(subItem => arrayOfItems.push(subItem))}) arrayOfItems = _.uniq(arrayOfItems) _.each(values, function (item) { _.each(arrayOfItems, function (color) { if(sums.hasOwnProperty(color)){ sums[color] = sums[color] + ( item[color] ? item[color] : 0 ) }else{ sums[color] = 0 + (item[color] ? item[color] : 0) } }); }); var arrOfSubDatasTotal = Object.keys(sums).map(item => ({name:item, total:sums[item]})) var totalOfSubDatas = Object.values(sums).reduce((a,b) => a + b) console.log("array Of SubDatas Total =>", arrOfSubDatasTotal) console.log("total Of SubDatas =>", totalOfSubDatas)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>
Try following using Array.reduce , Array.forEach , Array.map , Object.values , Object.entries 尝试使用Array.reduce , Array.forEach , Array.map , Object.values , Object.entries
LOGIC 逻辑
Create an object with keys as subData{number}
and value as the sum of its values . 创建一个键为
subData{number}
的对象,并将value作为其 value的总和 。
To create object, use Array.reduce
to iterate over each object in array and then Object.values
to get all the values in the object. 若要创建对象,请使用
Array.reduce
遍历数组中的每个对象,然后使用Object.values
获取该对象中的所有值。 Iterate over each value using Array.forEach
and then for each object, use Object.entries
to add / update the entry in intermediate object ( reduce accumulator ). 使用
Array.forEach
遍历每个值,然后对于每个对象,使用Object.entries
在中间对象中添加/更新条目( 减少accumulator )。
While creating the object, sum all the values to create the total
of all the subData's
. 创建对象时,对所有值求和以创建所有
subData's
total
。 Finally transform object
to array
using Object.entries
and use Array.map
to convert it into the desired format. 最后,使用
Object.entries
将object
转换为array
然后使用Array.map
将其转换为所需的格式。
var res = [{data1:{subData1:56, subData2:0, subData3:45},data2:{subData2:565, subData3:67, subData4:45},data3:{subData1:45, subData3:0},data4:{subData1:32, subData2:0, subData3:47},data5:{subData1:107, subData2:34, subData3:65},data6:{subData3:123, subData4:43},data7:{subData1:432, subData2:67, subData3:78},data8:{subData4:23, subData5:432, subData6:654}}]; let total = 0; let result = Object.entries( res.reduce((a,c) => { Object.values(c).forEach( o => Object.entries(o).forEach(([k,v]) => { a[k] = (a[k] || 0) + v; total += v; }) ); return a; }, {}) ).map(([k,v]) => ({name: k, total : v})); console.log(result); console.log(total);
You can use the Sum
monoid to whip through that list 您可以使用
Sum
monoid遍历该列表
import propOr from 'crocks/helpers/propOr'
import curry from 'crocks/helpers/curry'
import mreduceMap from 'crocks/helpers/mreduceMap'
import Sum from 'crocks/Sum'
var res = [{
data1:{subData1:56, subData2:0, subData3:45},
data2:{subData2:565, subData3:67, subData4:45},
data3:{subData1:45, subData3:0},
data4:{subData1:32, subData2:0, subData3:47},
data5:{subData1:107, subData2:34, subData3:65},
data6:{subData3:123, subData4:43},
data7:{subData1:432, subData2:67, subData3:78},
data8:{subData4:23, subData5:432, subData6:654},
}];
const data = Object.values(res[0])
const getSubData = i => propOr(0, 'subData' + i)
const getDataSum = curry(i => mreduceMap(Sum, getSubData(i)))
console.log(getDataSum(1, data))
// 672 - the sum of all subData1 properties in the list
You can try this in pure JS. 您可以在纯JS中尝试。 Hope it helps.
希望能帮助到你。
const res = [{ data1:{subData1:56, subData2:0, subData3:45}, data2:{subData2:565, subData3:67, subData4:45}, data3:{subData1:45, subData3:0}, data4:{subData1:32, subData2:0, subData3:47}, data5:{subData1:107, subData2:34, subData3:65}, data6:{subData3:123, subData4:43}, data7:{subData1:432, subData2:67, subData3:78}, data8:{subData4:23, subData5:432, subData6:654}, }]; const sums = {}; // For each item on your array res.forEach((item) => { Object.keys(item).forEach((key) => { Object.keys(item[key]).forEach((sub) => { // Initialize its position on the sum object if (!sums[sub]) sums[sub] = { sum: 0, name: sub }; sums[sub].sum += item[key][sub]; }); }); }); // Get the total of the subData const total = Object.values(sums).reduce((acc, val) => acc += val.sum, 0.0); console.log('Sums', Object.values(sums)); console.log('Total', total);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.