如何使用reduce返回聚合在JavaScript中较大数据集上的对象数组



我正在使用reduce()方法迭代一个大型数据集。我正在尝试计算数据集中的所有名称,并将每个名称作为带有总数的对象返回。

这是摩擦。它将数据集缩减为名称,但不计算数字。

var countedNames = __dataset.reduce(function (allBeers, beer) {
let t=0;
if (beer in allBeers) {
allBeers[ beer ] = {"name": beer,"count": t++};
} else {
allBeers[ beer ] = {"name": beer,"count": 1};
}
return allBeers;
}, []);

首先,你的累加器allBears被初始化为一个数组。从您开始使用的代码来看,您似乎更愿意拥有一个对象。所以,注意到我将最后一行从[]更改为{}

其次,您将在reduce函数中返回一个名为allNames的未定义变量。

以下代码应该可以工作(假设__dataset是一个字符串数组)。

var countedNames = __dataset.reduce(function (allBeers, beer) {
let count = allBeers.hasOwnProperty(beer) ? allBeers[beer].count + 1 : 0;
allBeers[beer] = { name : beer, count : count }
return allBeers;
}, {});

这将导致..

var __dataset = ["a", "b", "a", "b", "c", "c", "c"];
{
a: {
name: "a",
count: 2,
},
b: {
name: "b",
count: 2,
},
a: {
name: "c",
count: 3,
}
}

如果你想要一个对象数组(如表结构),你可以像这样迭代结果。

var results = Object.keys(countedNames)
.map(function(key) {
return countedNames[key];
});

这将产生这样的数组...

[
{ name: "a", count: 2 },
{ name: "b", count: 2 },
{ name: "c", count: 3 }
]

这是一个JS垃圾箱。 http://jsbin.com/segudeqiva/edit?js,console

最新更新