Создать новый массив из массива объектов с ключами другого объекта - PullRequest
1 голос
/ 18 июня 2020

У меня есть один массив объектов "cars"

let cars = [
{id: 1, name: 'Mercedes', year: '2015'},
{id: 2, name: 'Mercedes', year: '2000'},
{id: 3, name: 'BMW', year: '2010'},
{id: 4, name: 'BMW', year: '2004'},
{id: 4, name: 'BMW', year: '2004'},
{id: 4, name: 'BMW', year: '2004'},
{id: 4, name: 'BMW', year: '2004'},
{id: 4, name: 'BMW', year: '2004'},
{id: 5, name: 'Volvo', year: '2012'},
{id: 6, name: 'Volvo', year: '2014'},
{id: 7, name: 'Volvo', year: '2010'},
{id: 8, name: 'Toyota', year: '2012'},
{id: 8, name: 'Jeep', year: '2011'},
];

и один объект, который содержит количество автомобилей

let obj = {
BMW: 6,
Jeep: 1,
Mercedes: 2,
Toyota: 1,
Volvo: 3,
}

Мне нужно создать новый массив из автомобилей, которые будут иметь только один экземпляр объекта в нем и добавьте свойство "количество" к соответствующему объекту. Как я могу этого добиться?

ожидаемый результат.

newArray = [
    {id: 1, name: 'Mercedes', year: '2015', quantity: 2},
    {id: 3, name: 'BMW', year: '2010', quantity: 6},
    {id: 5, name: 'Volvo', year: '2012', quantity: 3},
    {id: 8, name: 'Toyota', year: '2012', quantity: 1},
    {id: 8, name: 'Jeep', year: '2011', quantity: 1},
]

Ответы [ 5 ]

2 голосов
/ 18 июня 2020

Вы можете рассчитывать напрямую, используя массив с таблицей ha sh.

let cars = [{ id: 1, name: 'Mercedes', year: '2015' }, { id: 2, name: 'Mercedes', year: '2000' }, { id: 3, name: 'BMW', year: '2010' }, { id: 4, name: 'BMW', year: '2004' }, { id: 4, name: 'BMW', year: '2004' }, { id: 4, name: 'BMW', year: '2004' }, { id: 4, name: 'BMW', year: '2004' }, { id: 4, name: 'BMW', year: '2004' }, { id: 5, name: 'Volvo', year: '2012' }, { id: 6, name: 'Volvo', year: '2014' }, { id: 7, name: 'Volvo', year: '2010' }, { id: 8, name: 'Toyota', year: '2012' }, { id: 8, name: 'Jeep', year: '2011' }],
    result = Object.values(cars.reduce((r, o) => {
        r[o.name] = r[o.name] || { ... o, quantity: 0 };
        r[o.name].quantity++;
        return r;
    }, []));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 18 июня 2020

Чтобы создать новый массив, его необходимо обработать в два этапа:

  1. Оставить первый car с уникальной маркой из массива автомобилей
  2. Добавить количество на номер car из obj

let cars=[
  {id:1,name:'Mercedes',year:'2015'},
  {id:2,name:'Mercedes',year:'2000'},
  {id:3,name:'BMW',year:'2010'},
  {id:4,name:'BMW',year:'2004'},
  {id:4,name:'BMW',year:'2004'},
  {id:4,name:'BMW',year:'2004'},
  {id:4,name:'BMW',year:'2004'},
  {id:4,name:'BMW',year:'2004'},
  {id:5,name:'Volvo',year:'2012'},
  {id:6,name:'Volvo',year:'2014'},
  {id:7,name:'Volvo',year:'2010'},
  {id:8,name:'Toyota',year:'2012'},
  {id:8,name:'Jeep',year:'2011'}
];
let obj = {
  BMW:6,
  Jeep:1,
  Mercedes:2,
  Toyota:1,
  Volvo:3,
};

/* The first step:
you can use .filter to 
only return the car you are looking for.
*/
let uniqueCarBrand = [];
let newArray = cars.filter((car) => {
  /* Check if car name already in the newArray */
  if (uniqueCarBrand.indexOf(car.name) >= 0) return false;
  uniqueCarBrand.push(car.name);
  return true;
});

/* Second step:
you will need to attach your quantity to
the array of cars you just created.
*/
let result = newArray.map((car) => {
  /* Check if obj has brand name in it, if not, return 0; */
  car.quantity = obj[car.name] || 0;
  return car;
});

console.log(result);
1 голос
/ 18 июня 2020

Создание нового массива со всеми элементами из объекта cars и счетчиком из obj без дублирования.

let cars = [{"id":1,"name":"Mercedes","year":"2015"},{"id":2,"name":"Mercedes","year":"2000"},{"id":3,"name":"BMW","year":"2010"},{"id":4,"name":"BMW","year":"2004"},{"id":4,"name":"BMW","year":"2004"},{"id":4,"name":"BMW","year":"2004"},{"id":4,"name":"BMW","year":"2004"},{"id":4,"name":"BMW","year":"2004"},{"id":5,"name":"Volvo","year":"2012"},{"id":6,"name":"Volvo","year":"2014"},{"id":7,"name":"Volvo","year":"2010"},{"id":8,"name":"Toyota","year":"2012"},{"id":8,"name":"Jeep","year":"2011"}];
let obj = {BMW: 6,Jeep: 1,Mercedes: 2,Toyota: 1,Volvo: 3}
let newObj = [];
let duplicateCheck = []
cars.forEach(function(item) {
  if (!duplicateCheck.includes(item.name)) {
    duplicateCheck.push(item.name);
    item.quantity = obj[item.name];
    newObj.push(item);
  }
});
console.log(newObj);
0 голосов
/ 18 июня 2020

Использование модулей ES6

let cars = [
  {id: 1, name: 'Mercedes', year: '2015'},
  {id: 2, name: 'Mercedes', year: '2000'},
  {id: 3, name: 'BMW', year: '2010'},
  {id: 4, name: 'BMW', year: '2004'},
  {id: 4, name: 'BMW', year: '2004'},
  {id: 4, name: 'BMW', year: '2004'},
  {id: 4, name: 'BMW', year: '2004'},
  {id: 4, name: 'BMW', year: '2004'},
  {id: 5, name: 'Volvo', year: '2012'},
  {id: 6, name: 'Volvo', year: '2014'},
  {id: 7, name: 'Volvo', year: '2010'},
  {id: 8, name: 'Toyota', year: '2012'},
  {id: 8, name: 'Jeep', year: '2011'},
];
let obj = {
  BMW: 6,
  Jeep: 1,
  Mercedes: 2,
  Toyota: 1,
  Volvo: 3,
}  

let filteredCar = cars.filter((curr, index) => {
  let _cars = JSON.stringify(curr);
  return index === cars.findIndex(obj => {
    return JSON.stringify(obj) === _cars;
  })
}).map(currCar => {
  currCar.quantity = obj[currCar.name];
                   return currCar});

console.log(filteredCar);
0 голосов
/ 18 июня 2020

Вы можете использовать два цикла для сопоставления объектов из обоих ваших массивов:

let output = [];
// For each key in your quantity object
for (let model in obj) {
    // For each car object in your cars array
    for (let car of cars) {
        // This will match the first car in your cars array
        if (car.name === model) {
            // Add quantity to your car object and add it to your result set
            car.quantity = obj[model];
            output.push(car);
            // This break will continue to the next model car to ensure you only have one result per model
            break;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...