我正在为我的产品列表创建一个过滤器来计算所有生产者,并显示如下:
Apple(3)
我从数组中删除了重复项:[“Apple”,“Apple”,“Apple”]我使用了以下链接:
Get all non-unique values (i.e.: duplicate/more than one occurrence) in an array
但我的问题是我想从数组中计算这些元素并将它们显示在一个对象数组中,因为我需要稍后迭代它。
从上面这个苹果数组我需要结果:[{“Apple”:3},{...},{...}]
我试图这样做,但它返回对象,我不能在它之后迭代: How to count duplicate value in an array in javascript
我需要一个对象数组它不重复
我正在使用Angular 4。
我的代码:
component.ts
async ngOnInit() {
this.cart$ = await this.cartService.getCart();
this.subscription = this.productService.getAll().subscribe(products => {
this.category = products.filter(
products => products.category == this.name
);
this.filters();
});
}
filters() {
this.category2 = this.category.map(value => value.producer);
this.filteredArray = this.eliminateDuplicates(this.category2);
console.log(this.filteredArray);
}
eliminateDuplicates(arr) {
let i,
len = arr.length,
out = [],
obj = {};
for (i = 0; i < len; i++) {
obj[arr[i]] = 0;
}
for (i in obj) {
out.push(i);
}
return out;
}
component.html
<div *ngFor="let f of filteredArray">
{{f}}
</div>
答案 0 :(得分:2)
下面:
const array = ["a", "a", "b"]
const result = { }
for (let i = 0; i < array.length; i++) {
result[array[i]] = (result[array[i]] || 0) + 1
}
Object.keys(result).map(key => ({ [key]: result[key] }))
最后一行是
的关键我试图这样做,但它返回了我的对象
答案 1 :(得分:1)
您可以使用reduce
汇总数组,map
表示所需的输出
let obj = ["Apple", "Apple", "Apple", "Orange"];
let result = Object.values(obj.reduce((c, v) => {
c[v] = c[v] || [v, 0];
c[v][1]++;
return c;
},{})).map(o=>({[o[0]] : o[1]}));
console.log(result);
答案 2 :(得分:0)
你可以简单地使用 Lodash countBy 函数来完成
filters() {
this.category2 = this.category.map(value => value.producer);
this.filteredArray = _.countBy(this.category2);
console.log(this.filteredArray);
// Object {Apple: 3, Orange: 1}
}