首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >筛选对象数组,其子对象必须匹配所有条件。

筛选对象数组,其子对象必须匹配所有条件。
EN

Stack Overflow用户
提问于 2018-08-01 18:33:08
回答 2查看 95关注 0票数 0

我需要通过一个带有嵌入对象数组的对象数组进行解析,我知道我可以用.filter()来解析。但是,我需要检查嵌入的数组是否至少有一种不同类型的对象。见下面的例子:

我有一系列的车库对象,其中有一个“汽车”字段,这是一系列的汽车。每辆车都是一个具有一系列品质的物体。我需要看看哪个车库至少有一辆“快”车和至少一辆“小”车。如果这两种品质都属于同一辆车是可以的。在javascript中实现这一点的最快/最有效的方法是什么?

代码语言:javascript
运行
复制
garageArray = [
 {
  id: 10,
  cars: [
   {id: 1, qualities: ["fast", "small"]},
   {id: 2, qualities: ["offRoad", "large"]},
   {id: 3, qualities: ["fast", "loud"]}
  ]
 },
 {
  id: 20,
  cars: [
   {id: 4, qualities: ["loud"]},
   {id: 5, qualities: ["fast", "tiny"]}
  ]
 },
 {
  id: 30,
  cars: [
   {id: 6, qualities: ["slow", "small"]},
   {id: 7, qualities: ["offRoad", "tiny"]},
   {id: 8, qualities: ["fast", "loud"]}
  ]
 }
]

结果应该是ids为20和30的车库。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-01 18:40:43

这应该可以做到:

代码语言:javascript
运行
复制
garageArray.filter(garage =>
    garage.cars.some(car => car.qualities.includes("fast")) &&
    garage.cars.some(car => car.qualities.includes("tiny"))
);

但是,匹配n个属性的一个更通用的解决方案如下:

代码语言:javascript
运行
复制
const garageArray = [
    {
        id: 10,
        cars: [
            { id: 1, qualities: ["fast", "small"] },
            { id: 2, qualities: ["offRoad", "large"] },
            { id: 3, qualities: ["fast", "loud"] }
        ]
    },
    {
        id: 20,
        cars: [
            { id: 4, qualities: ["loud"] },
            { id: 5, qualities: ["fast", "tiny"] }
        ]
    },
    {
        id: 30,
        cars: [
            { id: 6, qualities: ["slow", "small"] },
            { id: 7, qualities: ["offRoad", "tiny"] },
            { id: 8, qualities: ["fast", "loud"] }
        ]
    }
];

var featuresTofind = ["loud", "fast", "tiny"];

var result = garageArray.filter(function (garage) {
    var featuresFound = featuresTofind.filter(function (feature) {
        return garage.cars.some(function (car) {
            return car.qualities.includes(feature);
        });
    });
    return featuresFound.length === featuresTofind.length;
});

console.log(result);

票数 2
EN

Stack Overflow用户

发布于 2018-08-01 18:43:18

缺点是两次循环汽车:-)希望它是好的。

代码语言:javascript
运行
复制
garageArray.filter(garage => {
    return garage.cars.some(car => {
        return car.qualities.includes("fast")
    }) && garage.cars.some(car => {
        return car.qualities.includes("tiny")
    });
})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51640111

复制
相关文章

相似问题

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