好的,我研究了这个,但在这里找不到答案,所以希望这不是重复的。我也试图不具体,以便自己解决这个问题。
var arr = ['cat','car','cat','dog','car','dog']
function orgNums(input) {
var count = 0;
var obj = {};
for (var i = 0; i < input.length; i++) {
if (input[i] === 'cat')
obj['cat'] = count++;
}
return obj;
}
我希望它返回{cat:2}
,但我得到{cat:1}
最终我希望它返回{cat:2, car:1, dog:2, gerbil:1}
所以我尝试使用obj[cat] = ++count
并且我得到了我想要的答案,但是当我尝试第二个if语句时:if input[i] === 'dog', obj[dog] = ++count
我得到{cat:2, dog:4}
。我注意到它取count
已经在0,然后将其移动到2来计算cat,然后将其移动到4,将狗数设为2并将其加2。如何防止这种情况发生,以便count
每次重新开始为0?
编辑: 所以这很好用 var arr = [&#39; cat&#39;,&#39; car&#39;,&#39; cat&#39;,&#39; dog&#39;,&#39; car&#39;,& #39;狗&#39;]
function orgNums(input) {
var obj = {};
for (var i = 0; i < input.length; i++) {
obj[input[i]] = obj[input[i]] || 0;
obj[input[i]]++;
}
return obj;
}
console.log(orgNums(arr));
但我真正想要的最终输出是:
[
{cat:1
dog:2
}
{car:2
}
]
所以我尝试了这样的if语句:
if (input[i] === 'cat'||'dog')
但它仍在向对象投掷car
。我将尝试找出数组中的多个对象。再次感谢!
答案 0 :(得分:2)
你可以减少数组,并在你去的时候计算密钥
var arr = ['cat', 'car', 'cat', 'dog', 'car', 'dog', 'horse'];
function orgNums(input) {
return input.reduce((a, b) => {
return b in a ? a[b]++ : a[b] = 1, a;
}, {});
}
console.log(orgNums(arr));
&#13;
答案 1 :(得分:2)
由于postfix increment count
,在此循环中使用的count++
分配不起作用。这将为您提供计数器的值并在以后递增。如果您使用前缀增量++count
,则会获得指定的递增值。
// Postfix var x = 3; y = x++; // y = 3, x = 4 // Prefix var a = 2; b = ++a; // a = 3, b = 3
但是您可以省略变量并直接使用对象的属性进行计数。对于一个循环中的所有项目。
您可以将元素用作对象的键。然后分配零,如果不存在则增加。
var arr = ['cat', 'car', 'cat', 'dog', 'car', 'dog']
function orgNums(input) {
var obj = {};
for (var i = 0; i < input.length; i++) {
obj[input[i]] = obj[input[i]] || 0;
obj[input[i]]++;
}
return obj;
}
console.log(orgNums(arr));
&#13;
的更紧凑版本
var arr = ['cat', 'car', 'cat', 'dog', 'car', 'dog']
function orgNums(input) {
var obj = {};
input.forEach(function (item) {
obj[item] = (obj[item] || 0) + 1;
});
return obj;
}
console.log(orgNums(arr));
&#13;