сопоставление двух массивов эквивалентной длины по атрибутам объекта javascript

У меня есть два массива:

Массив 1:

[
    {
        name: 'Bob',
        traits: {
            id: 1
        }
    }, {
        name: 'Karl',
        traits: {
            id: 2
        }
    }, {
        name: 'Joseph',
        traits: {
            id: 3
        }
    }
]

Массив 2:

[
    {
        name: 'Karl',
        user_id: 2,
        dog: 'Rottweiler'
    }, {
        name: 'Joseph',
        user_id: 3,
        dog: 'Poodle'
    }, {
        name: 'Bob',
        user_id: 1,
        dog: 'Puppy'
    }
]

Желаемый результат:

Я хочу иметь возможность объединить второй массив в первый массив, найдя, какой элемент user_id соответствует идентификатору, а затем добавив объект в массив.

Например:

массив 1 объект

{
    name: 'Bob',
    traits: {
        id: 1
    }
}

Поскольку идентификатор совпадает с array 2 obj user_id:

{
    name: 'Bob',
    user_id: 1,
    dog: 'Puppy'
}

Окончательный результат будет:

{
    name: 'Bob',
    traits: {
        name: 'Bob',
        user_id: 1,
        dog: 'Puppy'
    }
}

person Juliette    schedule 28.05.2021    source источник


Ответы (2)


Превратите второй массив в карту с ключом user_id, а затем повторите первый массив. Найдите соответствующий объект на карте и распространите значение соответствующего объекта в свойство traits:

let arr1 = [{name: 'Bob',traits: {id: 1}},{name: 'Karl',traits: {id: 2}},{name: 'Joseph',traits: {id: 3}}];
let arr2 = [{name: 'Karl', user_id: 2,dog: 'Rottweiler'},{name: 'Joseph', user_id: 3,dog: 'Poodle'},{name: 'Bob',user_id: 1,dog: 'Puppy'}];

let map = new Map(arr2.map(item => [item.user_id, item]));

let result = arr1.map(item => {
    let traits = map.get(item.traits.id);
    return traits ? { ...item, traits} : item;
});

console.log(result);

Поскольку поиск на карте имеет амортизированную временную сложность O (1), это более эффективно, чем поиск ключа в массиве на каждой итерации (например, при вызове find).

person trincot    schedule 28.05.2021

Вы можете легко добиться этого результата, используя map и найти. Просто сопоставьте первый массив и найдите элемент с obj.traits.id в arr2. затем верните желаемый результат.

const arr1 = [
  {
    name: "Bob",
    traits: {
      id: 1,
    },
  },
  {
    name: "Karl",
    traits: {
      id: 2,
    },
  },
  {
    name: "Joseph",
    traits: {
      id: 3,
    },
  },
];

const arr2 = [
  {
    name: "Karl",
    user_id: 2,
    dog: "Rottweiler",
  },
  {
    name: "Joseph",
    user_id: 3,
    dog: "Poodle",
  },
  {
    name: "Bob",
    user_id: 1,
    dog: "Puppy",
  },
];

const result = arr1.map((obj) => {
  const { name, traits } = obj;
  const isExist = arr2.find((o) => o.user_id === traits.id);
  if (isExist) {
    return { name, traits: { ...isExist } };
  }
  return obj;
});

console.log(result);

person decpk    schedule 28.05.2021