【问题标题】:Count occurrence of each unique element in an array using ES5使用 ES5 计算数组中每个唯一元素的出现次数
【发布时间】:2018-07-19 10:02:39
【问题描述】:

我正在使用 AngularJS,并且有一个用例,其中我有一个类似于此的用户对象列表

[{
  name: 'name1',
  age: 21
}, {
  name: 'name2',
  age: 21
}, {
  name: 'name3',
  age: 21
}, {
  name: 'name1',
  age: 21
}, {
  name: 'name2',
  age: 21
}]

我需要计算每个唯一元素的频率并存储在一个对象中,以便使用 ng-repeat 轻松迭代。

对象:

{
  name: 'name1',
  count: 2
},
{
  name: 'name3,
  count: 1
}

使用 ES6 很简单,但 IE11 不支持,因为我使用的是 AngularJS。

因此,在 ES5 中寻找有效的解决方案。

【问题讨论】:

  • 你考虑使用 polyfill babel 吗?
  • 你有没有保证唯一的密钥?您想如何比较 - 通过所有键,还是仅通过名称?示例:如果 2 个人的姓名和年龄相同,那么只有其中一个人会在数组中?

标签: javascript unique frequency ecmascript-5


【解决方案1】:

您可以使用forEach() 并使用地图来映射名称和他们的数量。

var arr =[{ name: 'name1', age: 21 }, { name: 'name2', age: 21 }, { name: 'name3', age: 21 }, { name: 'name1', age: 21 }, { name: 'name2', age: 21 }];
var map = {};
var result = [];
arr.forEach(function(a){
  if(!map[a.name]){
    map[a.name] ={
      "name" : a.name,
      "count" : 0
    }
    result.push(map[a.name]);
  }
  map[a.name].count++;
});

console.log(result);

【讨论】:

    【解决方案2】:

    您可以将对象作为生成数组的助手。

    var data = [{ name: 'name1', age: 21 }, { name: 'name2', age: 21 }, { name: 'name3', age: 21 }, { name: 'name1', age: 21 }, { name: 'name2', age: 21 }],
        temp = Object.create(null),
        result = data.reduce(function (r, o) {
            if (!temp[o.name]) {
                r.push(temp[o.name] = { name: o.name, count: 0 });
            }
            temp[o.name].count++;
            return r;
        }, []);
        
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    或采取两步法

    var data = [{ name: 'name1', age: 21 }, { name: 'name2', age: 21 }, { name: 'name3', age: 21 }, { name: 'name1', age: 21 }, { name: 'name2', age: 21 }],
        temp = Object.create(null),
        result;
    
    data.forEach(function (o) {
        temp[o.name] = (temp[o.name] || 0) + 1;
    });
    
    result = Object.keys(temp).map(function (k) {
        return { name: k, count: temp[k] };
    });
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      var items = [{
        name: 'name1',
        age: 21
      }, {
        name: 'name2',
        age: 21
      }, {
        name: 'name3',
        age: 21
      }, {
        name: 'name1',
        age: 21
      }, {
        name: 'name2',
        age: 21
      }]
      
      var dictionary = {};
      var result = [];
      items.forEach(function(a){
        if(dictionary[a.name])
        {
        	dictionary[a.name].count++;
        }else
        {
        	dictionary[a.name] = {
            "name" : a.name,
            "count" : 1
          }
          result.push(dictionary[a.name]);
        }
       
      });
      
      console.log(result);

      【讨论】:

        猜你喜欢
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 2019-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多