.filter()函数返回未定义而不是过滤后的数组

时间:2019-06-29 03:10:01

标签: javascript arrays object

我正在尝试理解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 }]

5 个答案:

答案 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返回falsefilter()而不是返回值本身。

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
);