Fil*_*auw 3 javascript arrays lodash
我有一个数组,我想在其中获取唯一值及其出现次数,并对匹配的公司名称求和。我正在使用 lodash,到目前为止我能够获得每个唯一的值。
如何有效地获取每次出现的次数并对它们求和?价格数据是字符串。
var data = [
{"cat":"IT","company":"Apple", "price":"100.5"},
{"cat":"IT","company":"Apple", "price":"100"},
{"cat":"IT","company":"Google", "price": "100"},
{"cat":"IT","company":"Apple", "price": "100"}
];
Run Code Online (Sandbox Code Playgroud)
我需要的结果:
Company | Count | Sum
Apple | 3 | 300.5
Google | 1 | 100
Run Code Online (Sandbox Code Playgroud)
到目前为止我的代码:
var result = _.map(_.uniqBy(data, 'company'), function (item) {
$('table').append('<tr><td>'+item.company+'</td></tr>');
});
Run Code Online (Sandbox Code Playgroud)
是否可以在同一个 _.map 函数内进行求和和计数?
纯JS(Ecmascript5)解决方案使用Array.prototype.reduce()和Object.keys()功能:
var data = [
{"cat":"IT","company":"Apple", "price":"100.5"},
{"cat":"IT","company":"Apple", "price":"100"},
{"cat":"IT","company":"Google", "price": "100"},
{"cat":"IT","company":"Apple", "price": "100"}
], rows = "";
var result = data.reduce(function(r, o) {
if (r[o.company]){
++r[o.company].count;
r[o.company].price += Number(o.price);
} else {
r[o.company] = {count: 1, price: Number(o.price)};
}
return r;
}, {});
Object.keys(result).forEach(function(name){
rows += '<tr><td>'+ name +'</td>' +
'<td>'+ result[name].count +'</td>' +
'<td>'+ result[name].price +'</td></tr>';
});
$('table').append(rows);Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
<tr>
<th>Company</th>
<th>Count</th>
<th>Sum</th>
</tr>
</table>Run Code Online (Sandbox Code Playgroud)