简体   繁体   English

遍历数组内部的对象并将其求和

[英]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.reduceArray.forEachArray.mapObject.valuesObject.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.entriesobject转换为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM