【问题标题】:Iterate through array and average/sum values in it遍历数组和其中的平均值/求和值
【发布时间】:2021-03-11 23:28:48
【问题描述】:

我有一个对象数组,如果 sumList 数组中存在键,我想遍历这些对象并对一些值求和,并对所有其他对象求平均值。我们如何才能最好地实现这一目标?

let sumList = ['TEST1', 'TEST2']

data.forEach(item => {
    Object.keys(item).forEach(key => {
        if (!result.hasOwnProperty(key)) {
            result[key] = 0;
        }
        if(sumList.includes(key)) {
            result[key] += item[key]
        } else {
            result[key] = (result[key] + item[key]) / 2;
        }
    });
});

我遇到的错误,我认为与初始值为 0 的事实有关......它试图将 0 + 下一个值除以 2。我想在同一循环中执行此操作 insteam首先将它们相加,然后运行另一个循环并对它们进行平均。

【问题讨论】:

    标签: javascript arrays loops object foreach


    【解决方案1】:

    您可以使用reduce() 作为总和,filter() 作为计数,然后使用这两个值来计算平均值:

    const getValidKey = obj => sumList.find(key=>obj.hasOwnProperty(key));
    
    const sum = data.reduce((accum, currentObj) => {
        const key = getValidKey(currentObj);
        return key ? accum + currentObj[key] : accum;
    }, 0);
    
    const count = data.filter(currentObj=> 
        getValidKey(currentObj) !== undefined
    ).length;
    
    const average = sum/count;
    

    Live Demo

    只要没有数千个项目,遍历数组两次并没有错。代码可读性比提高几毫秒的性能更重要。

    【讨论】:

    • 有了这个......它给出了一个值的平均值......我想要数组中每个关键项的平均值
    【解决方案2】:

    应该是这样的:

    let sumList = ['TEST1', 'TEST2'], o, n, z, v, results = [];
    for(let a of data){
      o = {sums:0}; n = 0; z = 0;
      for(let o of a){
        for(let i in o){
          v = o[i];
          if(sumList.indexOf(i) === -1){
            o.sums += v;
          }
          else{
            z++; n += v;
          }
        }
      }
      o.avgs = z === 0 ? 0 : n/z;
      results.push(o);
    }
    

    【讨论】:

    • 并非所有人都是机器人。除了您的代码之外,对 OP 和其他访问者的一些解释会很棒!
    猜你喜欢
    • 2016-01-10
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多