在循环内重构循环以总结属性的总和

时间:2017-08-23 10:13:53

标签: javascript lodash

我有这些数据:

const data = [{
        date: '2017-08-4',
        data: [{
                    "name": "male",
                    "value": 2,
                  },
                  {
                    "name": "female",
                    "value": 46,
                  }
                ]
    },
    {
        date: '2017-08-5',
        data: [{
                    "name": "male",
                    "value": 2,
                  },
                  {
                    "name": "female",
                    "value": 20,
                  }
                ]
}]

我想找到男性价值的总和,所以这是我的代码。

let total_male_of_allDays = 0
        data.forEach(obj => {
            obj.data.forEach(obj2 => {
                if(obj2.name === 'male'){
                    total_male_of_allDays += obj2.value
                }
            })
        })

代码正常运行,但我觉得我的代码不够优雅。我可以使用原生循环来获得更好的性能,但我正在寻找更具可读性的东西。我对lodash方法持开放态度。

4 个答案:

答案 0 :(得分:1)

另一种方法可以是Array.prototype.reduce()Array.prototype.find()的组合。

data.reduce((result, entry) => {
  result += entry.data.find(d => d.name === "male").value;
  return result;
}, 0);

警告:如果male中只有一个 data条目,这只会产生正确的结果!

const data = [{
  date: '2017-08-4',
  data: [{
    "name": "male",
    "value": 2,
  }, {
    "name": "female",
    "value": 46,
  }]
}, {
  date: '2017-08-5',
  data: [{
    "name": "male",
    "value": 2,
  }, {
    "name": "female",
    "value": 20,
  }]
}];

const total_male_of_allDays = data.reduce((result, entry) => {
	result += entry.data.find(d => d.name === "male").value;
  return result;
}, 0);

console.log(total_male_of_allDays);

答案 1 :(得分:1)

您可以使用带有短路的嵌套Array#reduce进行检查和添加。

const data = [{ date: '2017-08-4', data: [{ name: "male", value: 2 }, { name: "female", value: 46 }] }, { date: '2017-08-5', data: [{ name: "male", value: 2 }, { name: "female", value: 20 }] }];

let total = data.reduce((r, o1) =>
    o1.data.reduce((s, o2) => s += o2.name === 'male' && o2.value, r), 0);

console.log(total);

答案 2 :(得分:1)

以下是使用flatMap将所有data提取到单个数组中的解决方案,filters将所有非男性提取,sum提取value let total = _(data) .flatMap('data') .filter({name: 'male'}) .sumBy('value');

jdbc:mysql://localhost:3306/ss?characterEncoding=utf8&useSSL=true&serverTimezone=UTC&nullNamePatternMatchesAll=true

答案 3 :(得分:0)

以下是使用lodash的代码

var count = 0;
var sum = 0;
_.map(data,function(o){
    _.map(o.data,function(obj){
        if(obj.name == "male") {
            sum = sum + obj.value
        }
    })
})
console.log(sum);