将相似的键/值对组合成一个数组

时间:2021-06-19 03:35:55

标签: javascript

我想知道是否可以根据给定的 id 将多个对象组合成一个对象数组?希望我能在下面更好地解释这一点:

试图让 carCollection 的每个索引项的输出是这样的:

[
  {
    brand: 'Porsche',
    model: ['Cayenne', 'Macan'],
    id: 1
  },
  {
    brand: 'BMW',
    model: ['M4','M3'],
    id: 3
  }
]

但下面的代码将 id:1 汽车品牌 Porsche 复制到 carCollection 中:

[
  {
    brand: 'Porsche',
    model: ['Cayenne'],
    id: 1,
  },
  {
    brand: 'Porsche',
    model: ['Macan'],
    id: 1
  }
]
let cars = {
    brands: [ {name:'Porsche', id:1}, {name:'Mercedes-Benz', id:2},{name:'BMW', id:3},],
    models: [  {name:'Cayenne', id:1}, {name:'C45', id:2}, {name:'M4', id:3}, {name:'M3', id:3}, {name:'Macan', id:1}]
}

// empty array
let carCollection = []

let { brands, models } = cars;


function carMatcher(brands, models){

    for(let brand of brands){
 
        for(let model of models){
            const carObject = {
                brand: '',
                model: [],
                id: 0
            }

           if(model.id === brand.id){
                    carObject.brand = brand.name
                    carObject.model.push(model.name)
                    carObject.id = brand.id
                    carCollection.push(carObject)
                
            } 
        }

    } 

}

carMatcher(brands, models)

1 个答案:

答案 0 :(得分:3)

您可以使用 MapforEach

轻松实现此结果

let cars = {
  brands: [
    { name: "Porsche", id: 1 },
    { name: "Mercedes-Benz", id: 2 },
    { name: "BMW", id: 3 },
  ],
  models: [
    { name: "Cayenne", id: 1 },
    { name: "C45", id: 2 },
    { name: "M4", id: 3 },
    { name: "M3", id: 3 },
    { name: "Macan", id: 1 },
  ],
};

const dict = new Map();

cars.brands.forEach(({ name, id }) => {
  dict.set(id, { brand: name, id, model: [] });
});

cars.models.forEach(({ name, id }) => {
  if (dict.has(id)) dict.get(id).model.push(name);
});

const result = [...dict.values()];
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

编辑:更简单的版本

let cars = {
  brands: [
    { name: "Porsche", id: 1 },
    { name: "Mercedes-Benz", id: 2 },
    { name: "BMW", id: 3 },
  ],
  models: [
    { name: "Cayenne", id: 1 },
    { name: "C45", id: 2 },
    { name: "M4", id: 3 },
    { name: "M3", id: 3 },
    { name: "Macan", id: 1 },
  ],
};

let dict = {},
  result = [];

for (let val of cars.brands) {
  dict[val.id] = {
    brand: val.name,
    id: val.id,
    model: [],
  };
}

for (let val of cars.models) {
  const id = val.id;
  const name = val.name;

  const objInDict = dict[id];
  if (objInDict) {
    objInDict.model.push(name);
  }
}

for (let key in dict) {
  result.push(dict[key]);
}

console.log(result);

最简单

let cars = {
  brands: [
    { name: "Porsche", id: 1 },
    { name: "Mercedes-Benz", id: 2 },
    { name: "BMW", id: 3 },
  ],
  models: [
    { name: "Cayenne", id: 1 },
    { name: "C45", id: 2 },
    { name: "M4", id: 3 },
    { name: "M3", id: 3 },
    { name: "Macan", id: 1 },
  ],
};

let result = [];
const { brands, models } = cars;

for (let brand of brands) {
  const { name, id } = brand;
  const newObj = { brand: name, id, model: [] };

  for (let model of models) {
    const { name, id } = model;
    if (newObj.id === id) {
      newObj.model.push(name);
    }
  }

  result.push(newObj);
}

console.log(result);