Использование фильтра и карты для изменения объединенного массива - PullRequest
0 голосов
/ 15 января 2019

У меня есть следующий код, который берет 2 массива объектов в JavaScript и сравнивает их и объединяет содержимое, возвращая все объекты из 1-го массива, а также все объекты из 2-го, которые имеют идентификатор, которого нет в 1-м.

Но для тех элементов, которые поступают из 2-го массива, я хочу изменить его запись в новом массиве, чтобы включить только определенные свойства (например, id & make) и добавить новое свойство-заполнитель (например, type: "car «). Я считаю, что это будет использовать функцию карты, но я не могу заставить ее работать.

    var cars1 = [
        {id: 1, make: "Ford",  model: "F150",  year: 2002},
        {id: 3, make: "Chevy", model: "Tahoe", year: 2003},
    ];

    var cars2 = [
        {id: 2, make: "Kia",    model: "Optima",  year: 2001},
        {id: 4, make: "Nissan", model: "Sentra",  year: 1982},
    ];

    const cars1IDs = new Set(cars1.map(({ id }) => id));
    const combined = [
      ...cars1,
      ...cars2.filter(({ id }) => !cars1IDs.has(id))
              .map(cars2 => cars2.id)
    ];
    combined.sort(({ id: aId }, {id: bId }) => aId - bId);
    console.log(combined);

Я хочу, чтобы объединенный массив заканчивался следующим содержимым:

var combined = [
    {id: 1, make: "Ford",   model: "F150",  year: 2002},
    {id: 2, make: "Kia",    type: "car"},
    {id: 3, make: "Chevy",  model: "Tahoe", year: 2003},
    {id: 4, make: "Nissan", type: "car"},
];

Но вместо этого это заканчивается как:

var combined = [
    {id: 1, make: "Ford",   model: "F150",  year: 2002},
    {id: 3, make: "Chevy", model: "Tahoe", year: 2003},
    2,
    4
];

Ответы [ 2 ]

0 голосов
/ 15 января 2019

вы должны изменить функцию карты Вот код. Только функция карты car2 это изменение

var cars1 = [
        { id: 1, make: "Ford", model: "F150", year: 2002 },
        { id: 3, make: "Chevy", model: "Tahoe", year: 2003 }
      ];

      var cars2 = [
        { id: 2, make: "Kia", model: "Optima", year: 2001 },
        { id: 4, make: "Nissan", model: "Sentra", year: 1982 }
      ];

      const cars1IDs = new Set(cars1.map(({ id }) => id));
      const combined = [
        ...cars1,
        ...cars2
          .filter(({ id }) => !cars1IDs.has(id))
          .map(car2 => {
              //add new prop type to car
              const tempCar2 = Object.assign(car2,{type:"car"});
              //remove year and model
              delete tempCar2.year                    
              delete tempCar2.model
              return tempCar2;
            //Object.assign(car2, { id: car2.id });
          })
      ];
      combined.sort(({ id: aId }, { id: bId }) => aId - bId);
      console.log(combined);
0 голосов
/ 15 января 2019

В .map вы должны извлечь свойства id и make и вернуть объект, содержащий только эти свойства плюс type из car:

var cars1 = [
    {id: 1, make: "Ford",  model: "F150",  year: 2002},
    {id: 3, make: "Chevy", model: "Tahoe", year: 2003},
];

var cars2 = [
    {id: 2, make: "Kia",    model: "Optima",  year: 2001},
    {id: 4, make: "Nissan", model: "Sentra",  year: 1982},
];

const cars1IDs = new Set(cars1.map(({ id }) => id));
const combined = [
  ...cars1,
  ...cars2.filter(({ id }) => !cars1IDs.has(id))
          .map(({ id, make }) => ({ id, make, type: 'car' }))
];
combined.sort((a, b) => a.id - b.id);
console.log(combined);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...