从 javascript 列表中的多个条件中获取匹配的值

Obtain values that match from several conditions on a list in javascript

我正在尝试从 Javascript 中的列表中获取列表。

这是列表:

const cars = [
  {
    id: 1,
    brand: "Mercedes Benz",
    properties: [
    {
      property: "Mechanical",
      value: 2,
    },
    {
      property: "Chemical",
      value: 2,
    },
    {
      property: "Pressure",
      value: 3,
    }],
  },
  
  {
    id: 2,
    brand: "BMW",
    properties: [
    {
      property: "Mechanical",
      value: 5,
    },
    {
      property: "Chemical",
      value: 3,
    },
    {
      property: "Pressure",
      value: 6,
    }],
  }
]

我需要匹配某些属性 属性 且值大于 X、Y

的汽车

例如,我想要 Mechanical 属性值大于 3 且 Pressure 大于 4 的汽车。在这种情况下,我将获得 ID 为 2 的完整对象。

有人有想法吗?这让我很为难

提示:我将其粘贴到节点 REPL 上 ;)

这是我试过但一无所获:

cars.filter(car => car.properties.some((p1, p2) => {return ((p1.property === "Mechanical" && p1.value > 3) && (p2.property === "Pressure" && p2.value > 4))}))

提前致谢

您需要遍历所有项目并检查每个项目的相关 条件,如果所有项目都通过,return true。在您的情况下,您正在检查每个项目的所有条件,并且由于没有项目的 属性 可以同时具有“机械”和“压力”值,因此全部失败。

当一个数组需要通过所有条件时,你应该使用 Array.every(),它只会 return true,如果所有迭代项都会 return true.

为了使其更通用,我们可以将条件存储为对象或 Map 中的函数。如果这个 property 有条件函数,我们将使用该函数来检查 value。如果没有,我们可以return true 立即。

注意:如果谓词不存在,此答案使用 Optional chaining (?.) and the Nullish coalescing operator (??) 到 return true。如果您的 运行 环境不支持此运算符,请将此行替换为 predicate[property] ? predicate[property](value) : true(参见第二个示例)。

const fn = (predicate, cars) =>
  cars.filter(car => car.properties.every(({ property, value }) =>
    predicate[property]?.(value) ?? true
  ))

const cars = [{"id":1,"brand":"Mercedes Benz","properties":[{"property":"Mechanical","value":2},{"property":"Chemical","value":2},{"property":"Pressure","value":3}]},{"id":2,"brand":"BMW","properties":[{"property":"Mechanical","value":5},{"property":"Chemical","value":3},{"property":"Pressure","value":6}]}]


const predicate = {
  Mechanical: value => value > 3,
  Pressure: value => value > 4,
}

const result = fn(predicate, cars)


console.log(result)

或者使用三元:

const fn = (predicate, cars) =>
  cars.filter(car => car.properties.every(({ property, value }) =>
    predicate[property] ? predicate[property](value) : true
  ))

const cars = [{"id":1,"brand":"Mercedes Benz","properties":[{"property":"Mechanical","value":2},{"property":"Chemical","value":2},{"property":"Pressure","value":3}]},{"id":2,"brand":"BMW","properties":[{"property":"Mechanical","value":5},{"property":"Chemical","value":3},{"property":"Pressure","value":6}]}]


const predicate = {
  Mechanical: value => value > 3,
  Pressure: value => value > 4,
}

const result = fn(predicate, cars)


console.log(result)