我有这些数据:
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方法持开放态度。
答案 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);