我试图从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上;)
这是我尝试过的,但我一无所获:
cars.filter(car => car.properties.some((p1, p2) => {return ((p1.property === "Mechanical" && p1.value > 3) && (p2.property === "Pressure" && p2.value > 4))}))提前感谢
发布于 2020-12-29 06:39:32
您需要迭代所有项,并检查每个项是否符合相关的条件,如果所有项都通过,则返回true。在您的情况下,您正在检查每个项目的所有条件,因为没有一个项目的属性可以同时具有“机械”和“压力”值,所以都失败了。
当数组需要传递所有条件时,如果所有迭代项都返回Array.every(),则应该使用只返回true的true。
为了使其更通用,我们可以将条件存储为对象或Map中的函数。如果这个property有一个条件函数,我们将使用这个函数来检查value。如果没有,我们可以立即返回true。
注意:如果谓词不存在,这个答案使用Optional chaining (?.)和Nullish coalescing operator (??)返回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)
https://stackoverflow.com/questions/65487974
复制相似问题