从 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)
我正在尝试从 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)