我正在使用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