2
我对js很新,试图用reduce替换for循环,并遇到麻烦。试图了解减少使用一个对象作为previousValue
据我所知,||
只评估左操作数。如果是真的,它会作为价值传递。如果它是虚假的,那么正确的操作数会被传递而不被评估,因为它是决定性的因素。
由于某些原因,这个工作在for循环中,但不是在reduce中。不应该无法读取obj[val]
或obj[arr[ind]]
使其在第一次迭代时返回0 + 1
?
'use strict';
let strings = ["One", "Two", "Two", "Three", "Three", "Three"];
let findMostCommon = (arr) => {
let str;
let obj;
let keys;
let counter;
str = "";
obj = {};
counter = 0;
for (let i = 0; i < arr.length; i++){
console.log(arr[i]); // One, Two, Two, Three, etc.
obj[arr[i]] = (obj[arr[i]] || 0) + 1; // Works
}
/*
arr.reduce((obj, val, ind, arr) => {
obj[val] = (obj[val] || 0) + 1;
}, obj)
obj[val] = (obj[val] || 0) + 1;
^
TypeError: Cannot read property 'Two' of undefined
*/
/*
arr.reduce((obj, val, ind, arr) => {
obj[arr[ind]] = (obj[arr[ind]] || 0) + 1;
}, obj)
obj[arr[ind]] = (obj[arr[ind]] || 0) + 1;
^
TypeError: Cannot read property 'Two' of undefined
*/
keys = Object.keys(obj);
for (let i in obj){
if (obj[i] > counter){
counter = obj[i]
}
}
str = keys[counter - 1];
return str;
}
console.log(
findMostCommon(strings)
)
'reduce'回调应该'return'。无论返回什么,都将作为第一个参数在下一次迭代中传递。 – zerkms
@zerkms哦对。咄。这很尴尬。谢谢。 –
不要评论你问的部分问题。格式化的SO代码变暗,使其难以阅读。 – Barmar