如何在数组中使用specail格式计算相同的项目(javascript)

时间:2015-07-11 02:10:32

标签: javascript lodash

例如:

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

来考虑一个更简洁的解决方案

2 个答案:

答案 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

本地完成。