@timofeus91
Junior Frontend Developer

Как правильно преобразовать массив объектов на основе другого массива?

Всем доброго дня! Вопрос следующий - есть два массива объектов. Нужно заменить объекты из 1 массива на объекты из 2 по определенному правилу. Заменить нужно только те объекты где id и secondId объекта второго массива совпадают с id и secondId объекта первого массива. Это нужно чтобы заменить объекты в первом массиве на объекты с новым значением data. Как можно такое реализовать оптимальным способом?

const firstArray = [
  {id: "id1", secondId: "id1", data: "old"},
  
  {id: "id2", secondId: "id2", data: "old"},
  
  {id: "id3", secondId: "id3", data: "old"},
  
  {id: "id4", secondId: "id4", data: "old"},
  
  {id: "id5", secondId: "id5", data: "old"},
  
  {id: "id6", secondId: "id6", data: "old"},
  
  {id: "id7", secondId: "id7", data: "old"},
]


const secondArray = [
  {id: "id1", secondId: "id1", data: "new"},
  
  {id: "id2", secondId: "id2", data: "new"},
  
  {id: "id3", secondId: "id3", data: "new"},
]


const justFunction = () => {


  return ?
}
  • Вопрос задан
  • 186 просмотров
Решения вопроса 2
v3shin
@v3shin
Веб-шаман
const thirdArray = firstArray.map(el1 => secondArray.filter(el2 => el2.id === el1.id && el2.secondId === el1.secondId)[0] || el1);
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
const keys = [ 'id', 'secondId' ];
const result = firstArray.map(n => secondArray.find(m => keys.every(k => n[k] === m[k])) ?? n);

или

const arrToTree = (arr, keys) =>
  arr.reduce((acc, n) => (
    keys.reduce((p, c, i) => p[n[c]] ??= i + 1 === keys.length ? n : {}, acc),
    acc
  ), {});


const keys = [ 'id', 'secondId' ];
const tree = arrToTree(secondArray, keys);
const result = firstArray.map(n => keys.reduce((p, c) => p?.[n[c]], tree) ?? n);

или

const arrToTree = (arr, keys) =>
  arr.reduce((acc, n) => (
    keys(n).reduce((p, c, i, a) => p.set(c, -~i === a.length ? n : new Map).get(c), acc),
    acc
  ), new Map);


const keys = n => [ n.id, n.secondId ];
const result = firstArray.map(function(n) {
  return keys(n).reduce((p, c) => p?.get(c), this) ?? n;
}, arrToTree(secondArray, keys));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы