JavaScript 中 reduce 方法内部的函数发生了什么? - JavaScript30 次练习
What's going on the function inside of reduce method in JavaScript? - JavaScript30 exercise
我一直在做 Wes Bos 的 JavaScript30 上的数组练习。
请帮我解决 this exercise.,这是 #8。
视频中的代码如下
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)
我试了两个版本,都得到了错误的输出或错误,想弄清楚上面的代码和这两个的区别。另外,我想了解这两个代码是怎么回事。
一个是下面的,不同的是设置了else
block.
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;
} else {
obj[item]++;
}
return obj;
}, {});
console.log(transportation)
这 return 是下面的对象。
{car: 0, truck: 0, bike: 0, walk: 0, van: 0}
在这种情况下,else
没有检测到任何东西吗?为什么函数保持 return 相同的值为零?
另一个是下面的,不同之处在于将 return
放在 else
块内。
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;
} else {
obj[item]++;
return obj;
}
}, {});
console.log(transportation)
这 return 是一个错误 Uncaught TypeError: Cannot read property 'car' of undefined
。
我了解到 return else
块中的对象会导致错误,因为这会终止执行。
但是,还是不明白那个错误信息的意思。我应该以某种方式在某处定义每个对象键吗?
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] === false`
if (!(item in obj)) {
obj[item] = 0;
} else {
obj[item]++;
}
return obj;
}, {});
console.log(transportation)
Reduce 函数接受一个函数,并且在每次迭代中,您 return 将分配给第一个参数(在我们的例子中为 obj)的任何值。您错过了 return,undefined 将被分配并因此出错。
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] = 1;
} else {
obj[item]++;
}
return obj;
}, {});
console.log(transportation)
我一直在做 Wes Bos 的 JavaScript30 上的数组练习。 请帮我解决 this exercise.,这是 #8。
视频中的代码如下
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)
我试了两个版本,都得到了错误的输出或错误,想弄清楚上面的代码和这两个的区别。另外,我想了解这两个代码是怎么回事。
一个是下面的,不同的是设置了else
block.
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;
} else {
obj[item]++;
}
return obj;
}, {});
console.log(transportation)
这 return 是下面的对象。
{car: 0, truck: 0, bike: 0, walk: 0, van: 0}
在这种情况下,else
没有检测到任何东西吗?为什么函数保持 return 相同的值为零?
另一个是下面的,不同之处在于将 return
放在 else
块内。
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;
} else {
obj[item]++;
return obj;
}
}, {});
console.log(transportation)
这 return 是一个错误 Uncaught TypeError: Cannot read property 'car' of undefined
。
我了解到 return else
块中的对象会导致错误,因为这会终止执行。
但是,还是不明白那个错误信息的意思。我应该以某种方式在某处定义每个对象键吗?
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] === false`
if (!(item in obj)) {
obj[item] = 0;
} else {
obj[item]++;
}
return obj;
}, {});
console.log(transportation)
Reduce 函数接受一个函数,并且在每次迭代中,您 return 将分配给第一个参数(在我们的例子中为 obj)的任何值。您错过了 return,undefined 将被分配并因此出错。
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] = 1;
} else {
obj[item]++;
}
return obj;
}, {});
console.log(transportation)