我有一个水果数组,它有以下元素
var fruits = ['Mango','Orange', 'Banana', 'Mango', 'Grapes', 'Orange', 'Apple', 'Apple', 'Banana', 'Mango']
我想生成一个对象数组的输出,它可以是
result = [{fruit : 'Mango', Count : 3}, {fruit : 'Orange', Count : 2}, {fruit : 'Banana', Count : 2},{fruit : 'Grapes', Count : 1}, {fruit : 'Apple', Count : 2}]
我怎样才能实现相同的目标?
使用 reduce
创建一个以键作为水果名称的对象。如果键已经存在,则 count 将创建一个具有属性 fruit
和 count
的对象,初始化为零。
const fruits = ['Mango', 'Orange', 'Banana', 'Mango', 'Grapes', 'Orange', 'Apple', 'Apple', 'Banana', 'Mango'];
const output = Object.values(fruits.reduce((a, fruit) => {
if (!a[fruit]) {
a[fruit] = {
fruit,
count: 0
};
}
a[fruit].count += 1;
return a;
}, {}));
console.log(output);
首先在 reduce(( 的帮助下计算单个水果的计数,最后通过 map(( 将该单个计数转换为预期的对象。
const fruits = ['Mango','Orange', 'Banana', 'Mango', 'Grapes', 'Orange', 'Apple', 'Apple', 'Banana', 'Mango']
const count = Object.values(fruits.reduce((old, cur) => (old[cur] = old[cur] || {fruit: cur, count: 0}, old[cur].count++, old), {}))
console.log(count)
试试这个:
const fruits = ['Mango', 'Orange', 'Banana', 'Mango', 'Grapes', 'Orange', 'Apple', 'Apple', 'Banana', 'Mango'];
const rst = Object.values(fruits.reduce((acc, ele) => (acc[ele] = {fruit: ele, count: (((acc[ele]||[])['count'])+=1) ||0}, acc),[]));
console.log(rst)