【问题标题】:How to count how many different objects in an array?如何计算数组中有多少个不同的对象?
【发布时间】:2019-01-06 01:41:16
【问题描述】:

我正在创建一个对象数组。数组可以有多个相同的对象,所以最终的结果是这样的:

MyArray = [obj1, obj1, obj2]

我想在不声明新变量的情况下计算数组中有多少个 obj1,因为我想使用这种方法来存储和计算数百个不同的对象。

这是一个 Angular 网络应用程序来管理订单。

我正在考虑将这些对象存储为:

MyArray = [{obj1: 2}, {obj2: 1}]

但我不知道该怎么做,也不知道添加另一个obj时如何增加值。

提前致谢。

【问题讨论】:

  • 相等的条件是什么?两个“相同”的对象 = 相同的引用或相同的值?

标签: javascript arrays


【解决方案1】:

您可以使用Map,您可以将对象作为键并计算出现次数。

var o1 = { a: 1 },
    o2 = { a: 1 },
    o3 = { a: 1 },
    array = [o1, o2, o1, o3, o1, o2],
    count = array.reduce((m, o) => m.set(o, (m.get(o) || 0) + 1), new Map);
    
console.log(Array.from(count));
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 这正是我想要的,谢谢!
【解决方案2】:

实现此目的的最短方法是使用set 后跟过滤器。

工作示例:

const data = [5, 5, 5, 4, 4, 8, 8, 8, 8, 8, 9]

const result = [...new Set(data)].map(value => ({
    value,
    amount: data.filter(field => field === value).length
}))

console.log(result)

并使用您想要的输出格式:

const data = [5, 5, 5, 4, 4, 8, 8, 8, 8, 8, 9]

const result = [...new Set(data)].map(value => ({
    [value]: data.filter(field => field === value).length
}))

console.log(result)

【讨论】:

    【解决方案3】:

    var array=['a1','a1','b1','c1','c1']
    var resultCount={}
    array.forEach(ele=>{ resultCount[ele] = (resultCount[ele]||0) + 1;});
    console.log(resultCount)

    【讨论】:

      【解决方案4】:

      我的第一个建议是尝试使用包含MultiSet 功能的 JavaScript 库(例如,在 Java 中)。 This question 可能会引导您找到可行的方法。

      如果您不想引入另一个依赖项,那么您可以定义自己的类来存储 Map 属性,该属性使用您要存储的对象作为键并将所述对象的数量保存为值 (more on JavaScript Maps)。

      您可以通过提供一个方法来做到这一点,例如myMultiSet.add(obj),如果obj 不在Map 中,该方法会将新元素添加到集合中,并将其计数值设置为1。如果obj 已经在Map 中,则只需将值增加1

      更新

      这是一个示例实现:

      class MultiSet {
        constructor() {
          this.items = new Map();
        }
        
        add(obj) {
          if (this.items.has(obj)) {
            console.log(`${obj} is already in items. Incrementing.`);
            this.items.set(obj, this.items.get(obj) + 1);
          } else {
            console.log(`${obj} is new to items. Adding.`);
            this.items.set(obj, 1);
          }
        }
        
        getCount(obj) {
          return this.items.get(obj);
        }
      };
      
      let obj1 = { blah: 1, blah2: 2 };
      
      let myMultiSet = new MultiSet();
      
      myMultiSet.add(obj1);
      myMultiSet.add(1);
      myMultiSet.add('tree');
      myMultiSet.add(1);
      myMultiSet.add(obj1);
      
      console.log(`Number of obj1 in set: ${myMultiSet.getCount(obj1)}`);
      console.log(`Number of 'tree' in set: ${myMultiSet.getCount('tree')}`);
      console.log(`Number of 1 in set: ${myMultiSet.getCount(1)}`);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-24
        • 2019-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-07
        • 1970-01-01
        相关资源
        最近更新 更多