【问题标题】:Use && operator with filter() method in JavaScript在 JavaScript 中使用 && 运算符和 filter() 方法
【发布时间】:2021-12-29 03:02:04
【问题描述】:

我的精神障碍让我无法前进。

我有一个数组,我将用以下代码举例说明:

let cars = [
  { brand: "Ford", year: "2012", color: "White", doors: "5", model: "One" },
  { brand: "Chevrolet", year: "2021", color: "Red", doors: "5", model: "Two" },
  { brand: "Chevrolet", year: "2000", color: "Black", doors: "5", model: "Three" },
  { brand: "Citroen", year: "2004", color: "Pink", doors: "3", model: "Four" },
];

我需要将所有满足有 5 个门条件的汽车存储在一个变量中。嗯,

let carsWithFiveDoors = cars.filter(({ doors }) => doors == "5");

但我也需要它同时满足两个条件。更清楚地说,对于只有那些 5 门汽车的新阵列,我需要应用另一个过滤器,使我只能拥有那些不是雪佛兰品牌的汽车,也不是红色的汽车。当我通过简单的逻辑将此方法应用于我的数组时,就会出现问题:

carsWithFiveDoors.filter(({ brand, color }) => brand !== "Chevrolet" && color !== "Red");

此过滤器的结果是以下数组:

let newArrayOfCars = [
  {
    brand: "Ford",
    year: "2012",
    color: "White",
    doors: "5",
    model: "One",
  },
  {
    brand: "Toyota",
    year: "2000",
    color: "Black",
    doors: "5",
    model: "Three",
  },
  {
    brand: "Citroen",
    year: "2004",
    color: "Pink",
    doors: "3",
    model: "Four",
  },
];

使用这种方法,我实现了生成一个没有任何雪佛兰汽车的数组,但我需要过滤掉那些同时是红色和雪佛兰品牌的汽车

我怎样才能做到这一点?我想了很多,我想我已经筋疲力尽了。

【问题讨论】:

  • 为什么 Citreon 会出现在那个数组中?它有三个门。您在原始列表中也没有丰田,为什么它会出现在最终输出中?

标签: javascript arrays filter


【解决方案1】:

由于您需要过滤掉品牌Chevrolet和红色的汽车,您需要实现以下逻辑表达式:

let newArrayOfCars = carsWithFiveDoors.filter(({ brand, color }) => !(brand === "Chevrolet" && color === "Red"));

【讨论】:

  • 我对此投了反对票,因为你所做的只是将这个声明改为brand === 'Chevrolet' && color === 'Red' - 这与他想要的截然相反。
  • @JonathonHibbard 那是我的错字。我的意思是!(brand === "Chevrolet" && color === "Red")。感谢您的评论
  • roger - 我将反对票改为赞成票
【解决方案2】:

filter 将始终返回一个新数组 - 您无法就地过滤数组。因此,您需要在 carsWithFiveDoors 数组上添加一个新过滤器,以生成一个新的 noRedFiveDoorChevs 数组。

注意:实际输出不会产生您预期的输出。

const cars = [
  { brand: "Ford", year: "2012", color: "White", doors: "5", model: "One" },
  { brand: "Chevrolet", year: "2021", color: "Red", doors: "5", model: "Two" },
  { brand: "Chevrolet", year: "2000", color: "Black", doors: "5", model: "Three" },
  { brand: "Citroen", year: "2004", color: "Pink", doors: "3", model: "Four" },
];

const carsWithFiveDoors = cars.filter(({ doors }) => doors === "5");

const noRedFiveDoorChevs = carsWithFiveDoors.filter(({ brand, color }) => {
  return brand !== "Chevrolet" && color !== "Red"
});

console.log(noRedFiveDoorChevs);

【讨论】:

    【解决方案3】:

    在这种情况下,您应该在此处使用双重过滤器。使用下面的代码,这应该可以解决您的问题。

    let newArrayOfCars = cars.filter(({ doors }) => doors == "5").filter(({ brand, color }) => brand !== "Chevrolet" && color !== "Red");
    

    还请注意,您可以尝试使用 && 将所有三个条件一次放入一个过滤器中。

    【讨论】:

    • 如果您不打算存储第一个过滤器的返回值,那么将它们组合成一个会更有效
    【解决方案4】:

    首先,您需要使用=== 而不是== - 这就是为什么您会在搜索结果中看到 3 门汽车和 5 门汽车。

    let carsWithFiveDoors = cars.filter(({ doors }) => doors === "5");
    

    另外,我认为您可以通过将 && 替换为 || 来简化此操作,这将过滤掉任何红色或雪佛兰汽车(我认为您说的是您想要的)。请随时纠正我,我会更新答案。

    我想你想要的是这样的:

    let carsWithFiveDoors = cars.filter({ doors, brand, color } => (doors === "5" && (brand !== "Chevrolet" || color !== 'Red'))
    

    【讨论】:

    • 1) 使用== 不仅会在输出中显示带有三扇门的汽车。 2)因为那样的话carsWithFiveDoors这个名字就没有意义了。
    • 是的。这就是为什么您可以在输出@Andy 中看到 3 门汽车的原因。查看他的原始帖子,您会看到{ brand: "Citroen", year: "2004", color: "Pink", doors: "3", model: "Four" }。这是因为在 Javascript 中,"3" == "5" 将返回 true,而 "3" === "5" 将返回 false。他最初的声明是他只想展示有 5 扇门的汽车。然后,他想过滤掉任何红牌以及雪佛兰汽车。所以声明doors == "5" 将匹配 both 3 and 5
    • @JonathonHibbard 不正确,"3" == "5" 返回false,而不是true
    • 值得指出的是,预期输出中的雪铁龙(三门)不在原始数据中,所以我不知道它来自哪里。 @JonathonHibbard
    • @NickParsons 是的,我今晚有阅读障碍,哈哈,是的,我理解 @Andy - 只是在解释 ===== 背后的原因
    猜你喜欢
    • 1970-01-01
    • 2017-04-28
    • 2016-05-17
    • 2021-07-14
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    相关资源
    最近更新 更多