我有一些函数可以计算数组中某些元素的数量:
let array = [5,1,2,3,4,7,2,1,2,3,4,5];
function countEntries(arr){
let entries = {};
arr.forEach(function (item) {
entries[item] += 1;
});
console.log(entries);
}
但是未定义默认值,这就是我得到的:
{ '1': NaN, '2': NaN, '3': NaN, '4': NaN, '5': NaN, '7': NaN }
我试图在forEach
内定义对象的属性:
arr.forEach(function (item) {
entries[item] = 0;
entries[item] += 1;
});
但是在这种情况下,该属性在每次迭代时都重置为零。如果我事先不知道对象属性的名称,该怎么办?
答案 0 :(得分:1)
有条件地添加默认值(可以使用逻辑OR)
entries[item] = entries[item] || 0
let array = [5, 1, 2, 3, 4, 7, 2, 1, 2, 3, 4, 5];
function countEntries(arr) {
let entries = {};
arr.forEach(function(item) {
entries[item] = entries[item] || 0;
entries[item] += 1;
});
console.log(entries);
}
countEntries(array);
答案 1 :(得分:1)
或简单地:
let array = [5,1,2,3,4,7,2,1,2,3,4,5]
, entries = {}
for(let e of array) entries[e] = (entries[e]) ? (entries[e]+1) : 1
console.log( JSON.stringify(entries) )
答案 2 :(得分:1)
这是reduce
的好用例:
const countEntries = array =>
array .reduce ((a, n) => ({...a, [n]: (a[n] || 0) + 1}), {})
let array = [5, 1, 2, 3, 4, 7, 2, 1, 2, 3, 4, 5];
console .log (
countEntries (array)
)
答案 3 :(得分:1)
您步入正轨!您只需将条件放入forEach中即可:
entries[item] ? entries[item] += 1 : entries[item]= 1;
表示该项目已在“ entries”对象中,然后增加编号(如果没有)-分配1。
完整代码为:
function countEntries(arr){
let entries = {};
arr.forEach(function (item) {
entries[item] ? entries[item] += 1 : entries[item] = 1;
});
console.log(entries);
}