如何计算一个数组中有多少个不同的对象?

时间:2019-01-05 16:58:57

标签: javascript arrays

我正在创建对象数组。该数组可以具有多个相同的对象,因此最终结果将类似于:

MyArray = [obj1, obj1, obj2]

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

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

我当时想将这些对象存储为:

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

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

谢谢。

4 个答案:

答案 0 :(得分:2)

您可以使用Map,在这里您可以将对象作为键并计算发生次数。

Outputs:
  HarvestApi:
    Description: URL for application
    Export:
      Name: HarvestApi
    Value: !Ref 'LocationRef'
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));

答案 1 :(得分:0)

最简单的方法是使用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)

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

我的第一个建议是尝试使用包含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)}`);