首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从javascript中列表中的几个条件中获取匹配的值。

从javascript中列表中的几个条件中获取匹配的值。
EN

Stack Overflow用户
提问于 2020-12-29 06:04:03
回答 1查看 23关注 0票数 0

我试图从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的汽车。

例如,我想要力学性能大于3,压力大于4的汽车。在这种情况下,我将得到id 2的完整对象。

有谁有主意吗?这让我很难过

提示:我把它粘贴在节点REPL上;)

这是我尝试过的,但我一无所获:

代码语言:javascript
复制
cars.filter(car => car.properties.some((p1, p2) => {return ((p1.property === "Mechanical" && p1.value > 3) && (p2.property === "Pressure" && p2.value > 4))}))

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-29 06:39:32

您需要迭代所有项,并检查每个项是否符合相关的条件,如果所有项都通过,则返回true。在您的情况下,您正在检查每个项目的所有条件,因为没有一个项目的属性可以同时具有“机械”和“压力”值,所以都失败了。

当数组需要传递所有条件时,如果所有迭代项都返回Array.every(),则应该使用只返回truetrue

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

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

代码语言:javascript
复制
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)

或者使用三元:

代码语言:javascript
复制
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)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65487974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档