例如:
input: var arr = ['a','b','c','a-5','c-2'];
output: var result = {'a':6,'b':1,'c':'3'} ;
我的解决方案是:
function countSameItem(arr) {
var counter = {};
for (var i = 0; i < arr.length; i++) {
var item = arr[i].split('-');
if (item.length === 1) {
counter[item] = (counter[item] + 1) || 1;
} else {
counter[item[0]] = (counter[item[0]] + parseInt(item[1]) || parseInt(item[1]));
}
}
return counter;
}
但是我想用lodash
来考虑一个更简洁的解决方案答案 0 :(得分:1)
如果没有lodash,你可以简洁地完成:
var result = ['a','b','c','a-5','c-2'].reduce(function(o, s) {
var a = s.split('-').concat(1);
return o[a[0]] = (o[a[0]] || 0) + +a[1], o;
}, Object.create(null));
答案 1 :(得分:0)
使用lodash,您将以与Oriol使用原生reduce函数的方式类似的方式使用_.reduce函数
function countSameItem(arr) {
return _.reduce( arr, function(counter, n, i) {
var narr=n.split('-');
counter[narr[0]] = (counter[narr[0]] || 0) + (1*narr[1] || 1);
return counter;
}, {});
}
counter是累加器,最终从函数返回的内容
n是每个元素
i是每个元素的索引。
对于输入数组计数器中的每个元素,获取最后运行的元素返回的值。 _.reduce中的第三个参数给出了counter的初始值。
使用本机实现可能更好,除非您将lodash用于其他功能并希望代码保持一致。
reduce的lodash版本确实具有处理对象和数组的好处,但是这可以通过使用Object.keys(arr).reduce