【问题标题】:How to count number of occurrences of distinct values from an array of objects in Javascript?如何计算Javascript中对象数组中不同值的出现次数?
【发布时间】:2017-09-26 04:34:11
【问题描述】:

我有一个对象数组,如下所示:

var array =
    [
        {"name":"abc","age":20}
        {"name":"abc","age":20}
        {"name":"abc","age":20}
        {"name":"xyz","age":21}
        {"name":"xyz","age":21}
    ]

我想计算不同值的出现次数,例如:

[3,2]

假设 abc 出现 3 次,xyz 出现 2 次。

我在reactjs 做这件事。我可以使用 this answer 获得不同的值,例如 [abc,xyz]

首选ES6语法。

【问题讨论】:

    标签: javascript arrays reactjs ecmascript-6


    【解决方案1】:

    快速回答:new Set(array).size

    解释(来自 MDN 网络文档):

    Set 对象允许您存储任何类型的唯一值,无论是 原始值或对象引用

    【讨论】:

    • 这只会返回数组的长度。这不是提问者想要的。
    • @trincot 不。它将返回包含独特元素的 Set 的基数。
    • 我认为您误解了这个问题:Set 的大小将与 Array 的长度相同,因为 OP 数组中的所有对象都是不同的。如果某些对象在该数组中被多次引用,您只会得到不同,但对于 OP 呈现的内容并非如此:他们的问题不是寻找唯一的对象引用,而是寻找具有唯一属性值的对象(即name) 在那些 distinct 对象中。
    【解决方案2】:

    您可以使用forEach/map 来迭代数组并将计数存储在另一个变量中,请检查:

    var array = [
         {"name" : "abc", "age" : 20},
         {"name" : "abc", "age" : 20},
         {"name" : "abc", "age" : 20},
         {"name" : "xyz", "age" : 21},
         {"name" : "xyz", "age" : 21},
    ];
        
    let b = {};
    
    array.forEach(el => {
        b[el.name] = (b[el.name] || 0) + 1;
    })
    
    console.log(b);

    【讨论】:

      【解决方案3】:

      您需要知道计数属于哪个名称,因此我建议不要输出一个不提供任何线索的数组,而是输出一个以名称为键并以相应计数作为值的对象:

      var result = array.reduce( (acc, o) => (acc[o.name] = (acc[o.name] || 0)+1, acc), {} );
      

      var array =
          [
              {"name":"abc","age":20},
              {"name":"abc","age":20},
              {"name":"abc","age":20},
              {"name":"xyz","age":21},
              {"name":"xyz","age":21}
          ];
          
      var result = array.reduce( (acc, o) => (acc[o.name] = (acc[o.name] || 0)+1, acc), {} );
      
      console.log(result);

      【讨论】:

        【解决方案4】:

        地图/减少救援:

        const frequency = array
          .map(({ name }) => name)
          .reduce((names, name) => {
            const count = names[name] || 0;
            names[name] = count + 1;
            return names;
          }, {});
        
        // frequency: { abc: 3, xyz: 2 }
        

        【讨论】:

          【解决方案5】:

          如果有人在寻找存储在数组中的不同计数

          var result = array.reduce( (acc, o) => (acc[o.name] = (acc[o.name] || 0)+1, acc), {} );
          result = Object.values(result); // returns an array of values from the object
          // result will be [3,2]
          

          【讨论】:

            【解决方案6】:

            这是一种方法:

            var array =
            	[
            		{"name":"abc","age":20},
            		{"name":"abc","age":20},
            		{"name":"abc","age":20},
            		{"name":"xyz","age":21},
            		{"name":"xyz","age":21}
            	]
            
            
            let yy = {}
            array.map( el => {
            	yy[el.name] = (yy[el.name] || 0) + 1
            })
            
            console.log(yy)

            这是另一种方式:

            var array =
            	[
            		{"name":"abc","age":20},
            		{"name":"abc","age":20},
            		{"name":"abc","age":20},
            		{"name":"xyz","age":21},
            		{"name":"xyz","age":21}
            	]
            
            
            let yy = {}
            array.map( el => {
            	if (yy[el.name] === undefined || yy[el.name] === 0) {
            		yy[el.name] = 1
            	} else {
            		yy[el.name] = yy[el.name] + 1
            	}
            })
            
            console.log(yy)

            【讨论】:

              猜你喜欢
              • 2020-01-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多