我正在尝试理解javascript的Array.filter
方法。
为什么以下代码返回undefined
?我想念什么?
function driversWithRevenueOver(driver, revenue) {
driver.filter(function(person) {
if (person.revenue >= revenue) {
return person;
}
});
}
driversWithRevenueOver(
[
{ name: "Sally", revenue: 400 },
{ name: "Annette", revenue: 200 },
{ name: "Jim", revenue: 150 },
{ name: "Sally", revenue: 200 }
],
250
);
它应该返回:
[{ name: 'Sally', revenue: 400 }]
答案 0 :(得分:5)
根据Array.filter上的文档:
filter()方法创建一个具有所有通过元素的新数组 通过提供的功能实现的测试。
因此,在您的情况下,主要问题是即使调用了does not return anything
,函数Array.filter
也是如此。因此,您需要:
function driversWithRevenueOver(driver, revenue) {
return driver.filter(function(person) { // <-- return here
return person.revenue >= revenue)
});
}
有关传递给Array.filter
的功能的更多信息,也称为回调:
函数是谓词,用于测试数组的每个元素。返回 true 保留元素,否则 false 。
因此,您需要从函数中返回boolean value
。
此过滤器的简短版本可能是:
let data = [{ name: "Sally", revenue: 400 }, { name: "Annette", revenue: 200 }, { name: "Jim", revenue: 150 }, { name: "Sally", revenue: 200 } ]
let result = data.filter(x => x.revenue > 250) // <-- function returns boolean
console.log(result)
答案 1 :(得分:3)
您需要从函数返回filter()
的结果。另外,您应该从true
返回false
或filter()
而不是返回值本身。
function driversWithRevenueOver(driver, revenue) {
return driver.filter(function(person) {
return person.revenue >= revenue
});
}
具有箭头功能,它将看起来更干净。
const driversWithRevenueOver = (driver, revenue) =>
driver.filter(person => person.revenue >= revenue);
答案 2 :(得分:2)
它返回undefined,因为您从不返回外部函数:
function driversWithRevenueOver(driver, revenue) {...}
在此函数中执行return
时,您将返回到.filter(callback)
中的内部回调函数:
driver.filter(function(person) { <----
if (person.revenue >= revenue) { | returns to callback (not driversWithRevenueOver)
return person; ------------------|
}
});
因此,您的driversWithRevenueOver
隐式返回undefined
(因为您没有调用返回其中的任何内容)。因此,您需要返回.filter()
的结果。此外,您还需要修复您的return
语句。如果您返回driver
,则filter方法会将项目保留在原始true
数组中;如果从内部回调中返回false
,则将其删除。因此,您可以简单地返回person.revenue >= revenue
的求值:
function driversWithRevenueOver(driver, revenue) {
return driver.filter(function(person) {
return person.revenue >= revenue;
});
}
function driversWithRevenueOver(driver, revenue) {
return driver.filter(function(person) {
return person.revenue >= revenue;
});
}
const res = driversWithRevenueOver(
[{
name: "Sally",
revenue: 400
},
{
name: "Annette",
revenue: 200
},
{
name: "Jim",
revenue: 150
},
{
name: "Sally",
revenue: 200
}
],
250
);
console.log(res);
答案 3 :(得分:0)
您需要return
过滤后的数组。
return driver.filter(...);
您还可以像这样使代码更简洁-请注意filter
仅需要布尔响应。
const driversWithRevenueOver = (driver, revenue) => driver.filter(({ revenue: r }) => r >= revenue);
console.log(driversWithRevenueOver(
[{name:"Sally",revenue:400},{name:"Annette",revenue:200},{name:"Jim",revenue:150},{name:"Sally",revenue:200}],
250
));
答案 4 :(得分:0)
您只需要在代码中进行一次修改,其余就好。
function driversWithRevenueOver(driver, revenue) {
return driver.filter(function(person) { // you forgot to return the filtered array
if (person.revenue >= revenue) {
return person;
}
});
}
driversWithRevenueOver(
[
{ name: "Sally", revenue: 400 },
{ name: "Annette", revenue: 200 },
{ name: "Jim", revenue: 150 },
{ name: "Sally", revenue: 200 }
],
250
);