组数组并计数

时间:2018-10-09 00:28:11

标签: javascript node.js

说我有这样的数组:

[
   "foo",
   "bar",
   "foo"
   "bar",
   "bar",
   "bar",
   "zoom"
]

我想对它进行分组,这样我就可以得到一个计数:

{
  "foo": 2,
  "bar": 4,
  "zoom": 1
}

有可以执行此操作的实用程序吗?

6 个答案:

答案 0 :(得分:4)

只需使用函数Array.prototype.reduce

let array = [   "foo",   "bar",   "foo",   "bar",   "bar",   "bar",   "zoom"],
    result = array.reduce((a, c) => (a[c] = (a[c] || 0) + 1, a), Object.create(null));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

您可以使用数组对象上可用的reduce()方法来实现此分组。因此,与此类似的事情可能会实现您的追求:

    var input = [
       "foo",
       "bar",
       "foo",
       "bar",
       "bar",
       "bar",
       "zoom"
    ]
    
    // Iterate the input list and construct a grouping via a "reducer"
    var output = input.reduce(function(grouping, item) {
    
      // If the current list item does not yet exist in grouping, set 
      // it's initial count to 1
      if( grouping[item] === undefined ) {    
        grouping[item] = 1;
      }
      // If current list item does exist in grouping, increment the 
      // count
      else {
        grouping[item] ++;
      }
    
      return grouping;
    
    }, {})
    
    console.log(output)

答案 2 :(得分:1)

是的,您可以使用键和计数reduce()将数组const input = [ "foo", "bar", "foo", "bar", "bar", "bar", "zoom" ]; const result = input.reduce((total, value) => { total[value] = (total[value] || 0) + 1; return total; }, {}); console.log(result);到对象,就像这样:

{{1}}

希望有帮助!

答案 3 :(得分:1)

您可以通过reduce以简洁的方式执行此操作:

var arr = [ "foo", "bar", "foo", "bar", "bar", "bar", "zoom" ] 

var result = arr.reduce((r,c) => (r[c] = (r[c] || 0) + 1, r), {})

console.log(result)

如果您打算使用lodash_.countBy,它会变得非常可爱:

var arr = [ "foo", "bar", "foo", "bar", "bar", "bar", "zoom" ] 

var result = _.countBy(arr);

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

答案 4 :(得分:0)

是的,我猜想是Array.prototype.reduce,它只是:

  const map = list.reduce((a, b) => {
            a[b] = a[b] || 0;
            return ++a[b], a;
          }, {});

想知道是否没有那么冗长的方法。

答案 5 :(得分:0)

说明:首先,我们create object(一个全新的空对象)。其次,我们使用spread operator首先复制现有数组中的所有内容,并从中复制一个new array,然后使用它来创建新的Set(Set对象可以存储 { {1}} 值)并使用它作为键,最后我们filter移出数组(在length属性的帮助下)查看特定< strong> unique 发生,并将其设置为对象的 key 。记住,由于我们使用了value并将所有内容放入其中,因此返回的对象是一个对象,其中包含我尝试(据我所知)在 :)范围内的所有内容。 / strong>我们在这里还使用了comma operator,它简单地评估了每个操作数(从左到右)并返回最后一个操作数的值。

Object.assign()