坚持使用具有 ID 的对象的比较数组

Stuck with comparison arrays with objects which has IDs

提问人:Ev Gen 提问时间:7/28/2023 更新时间:7/28/2023 访问量:28

问:

我有 2 个带有对象的数组

  1. 与汽车品牌
const brands = [
   { id: 1, name: "Mercedes Benz", bodyType: [1, 3] },
   { id: 2, name: "Audi", bodyType: [1, 2] },
   { id: 3, name: "BMW", bodyType: [3, 4] },
   { id: 4, name: "Mazda", bodyType: [1, 2, 4] }
];
  1. 体型
const bodyTypes = [
   { id: 1, type: "Sedan"},
   { id: 2, type: "Coupe"},
   { id: 3, type: "Hatchback"},
   { id: 4, type: "SUV"}
];
  1. 我选择了类型
const pickedTypes = [2, 4] // Coupe & SUV

如何比较这两个数组以获得具有 pickedTypes 中正文类型的品牌的新数组

我试图得到一个我想要的数组

const brands = [
   { id: 1, name: "Mercedes Benz", bodyType: [1, 3] },
   { id: 2, name: "Audi", bodyType: [1, 2] },
   { id: 3, name: "BMW", bodyType: [3, 4] },
   { id: 3, name: "Mazda", bodyType: [1, 2, 4] }
];

const bodyTypes = [
   { id: 1, type: "Sedan"},
   { id: 2, type: "Coupe"},
   { id: 3, type: "Hatchback"},
   { id: 4, type: "SUV"}
];

const pickedTypes = [2, 4] // coupe & suv

let newBrandsByPickedTypes = [];

// loop for every type
for(let i = 0; i < pickedTypes.length; i++){
  // loop for every brand
  for(let k = 0; k < brands.length; k++){
      // loop for every type in brand
      brands[k].bodyType.forEach((type) => {
        // if brand has type that in pickedTypes push this brand to newBrandsByPickedTypes 
        if(type === pickedTypes[i]){
            newBrandsByPickedTypes.push(brands[k])
        }
      })
  }

}

newBrandsByPickedTypes && console.log(newBrandsByPickedTypes); // output audi, mazda, bmw

实际上,我陷入了这么多循环中。

看起来它正在工作,但我有一个类似警告的东西:[圆形对象对象]]

JavaScript 数组 筛选器 比较

评论

0赞 Ev Gen 7/28/2023
实际上马自达被添加了 2 次

答:

0赞 Abhishek Prashant 7/28/2023 #1

您可以根据 pickedTypes 中的任何 ID 是否存在于单个品牌的 bodyType 数组中,从 brands 数组中进行筛选。这是一个可能的解决方案

brands.filter(brand => pickedTypes.some(type => brand.bodyType.includes(type))).map(brand => brand.name)

输出

['Audi', 'BMW', 'Mazda']

在这种情况下,由于 pickedType 已经包含 id 而不是名称,因此不需要 bodyTypes 数组,如果 pickedTypes 有“Sedan”、“Coupe”等,您可以映射 bodyTypes 中的 id 并使用该数组进行搜索

0赞 gachaftcode 7/28/2023 #2

我可以看到您正在尝试比较两个数组,以获得一个新数组,其中包含具有 pickedTypes 数组中的正文类型的品牌。您的代码可以正常工作,但您会收到有关圆形对象的警告消息。

此警告通常意味着代码正在对象之间创建循环引用,从而导致无限循环。我建议检查您的对象,看看其中是否有任何循环引用。

此外,您可以使用 filter() 方法筛选掉 pickedTypes 数组中没有正文类型的品牌来简化代码。下面是一个示例:

brands.filter(brand => pickedTypes.some(type => brand.bodyType.includes(type))).map(brand => brand.name)

此代码使用 filter() 方法筛选出 pickedTypes 数组中没有任何正文类型的品牌。some() 方法用于检查品牌中是否有任何体型在 pickedTypes 数组中。

我希望这会有所帮助!