有人可以解释一下reduce()如何计算数组项的实例并将它们添加到下面代码中的空对象中?例如,我们最终得到{ car: 5, truck: 3 }
。我不太明白obj[item]
是什么。
const data = ['car', 'car', 'truck', 'truck', 'bike', 'walk', 'car', 'van', 'bike', 'walk', 'car', 'van', 'car', 'truck' ];
const transportation = data.reduce(function(obj, item) {
if (!obj[item]) {
obj[item] = 0;
}
obj[item]++;
return obj;
}, {});
console.log(transportation);//{car: 5, truck: 3, bike: 2, walk: 2, van: 2}
答案 0 :(得分:2)
const data = ['car', 'car', 'truck', 'truck', 'bike', 'walk', 'car', 'van', 'bike', 'walk', 'car', 'van', 'car', 'truck' ];
const transportation = data.reduce(function(obj, item) {
console.log(obj, item);
if (!obj[item]) {
obj[item] = 0;
}
obj[item]++;
return obj;
}, {});
console.log(transportation);//{car: 5, truck: 3, bike: 2, walk: 2, van: 2}

如果你可以看到控制台输出,你会看到对象obj将作为一个数据结构,其中键作为数组元素,值作为频率,如果属性未定义,它将被初始化为0,在进一步的步骤中,我们只需要增加该值。
obj [item]是对象的属性。当一个唯一的字符串出现并且将被初始化为0时会创建这个,在每个下一步我们只会增加这个值
注意在reduce中,第一个参数是上一次迭代传递的对象(最初为{})。第二个将遍历每个元素
答案 1 :(得分:1)
你可以发现第一个回调函数是累加器。这是您的obj
- >减少的结果。 item
是正在处理的 currentValue - >在你的情况下是数组data
中的一个字符串。 obj[item]
用于存储item
数组中出现data
个字符串的次数的计数。
答案 2 :(得分:1)
让我们举一个更简单的例子:将数组中的所有整数加在一起。
const data = [1, 2, 3, 4, 5];
const sum = data.reduce(function(total, num) {
return total + num;
}, 0);
reduce
接受一个有两个参数的函数:1)total
,累加器,传递到进程的下一次迭代,并设置为0
初始化value,和2)num
,迭代中当前正在处理的元素。
对于每次迭代,num
被添加到总数中,在最后一次迭代之后,传递到sum
(the result is 15
)。
在您的示例中,空对象充当累加器,值(项)被添加为对象键。
const transportation = data.reduce(function(obj, item) {
// if the object does not have a key matching the value
// of item, create it and set it to zero
// for example: obj['car'] = 0
if (!obj[item]) {
obj[item] = 0;
}
// Now we increase the value of that property because
// we want to indicate an instance of that car, bike, truck etc
// For example `obj['car']++`
obj[item]++;
// Then we return the object (accumulator) for the next
// iteration
return obj;
}, {});