Изменить массив значений объекта на основе другого массива

const array1 = [
  {
    id: "40",
    alias: "Number",
    name: "Number",
  },
  {
    id: "41",
    alias: "Salary",
    name: "Salary",
  },
];


const array2 = [
  {
    id: "Sum__Salary__U3VtKFVTJTIwRW1wbG95ZWUuU2FsYXJ5KQ__",
    name: "Salary",
  },
  { id: "40", name: "Number" },
];

Я хочу изменить свой массив2, мой идентификатор «Зарплата» должен стать «41» во втором массиве вместо «Sum__Salary__U3VtKFVTJTIwRW1wbG95ZWUuU2FsYXJ5KQ__»

Делюсь фрагментами, которые я пробовал:

const result = array1
  .filter((array1Value) =>
    [...array2].find(
      (array2Value) => array2Value.name === array1Value.alias
    )
  )
  .map((column) => ({
    id: column.id,
    name: column.name,
  }));
console.info("result: ", result);

Приведенный выше фрагмент работает нормально, но здесь я возвращаю новый набор массива с помощью карты. Есть ли способ заменить значения вместо создания нового набора массива? Ищете хороший подход для реализации этого.

🤔 А знаете ли вы, что...
JavaScript поддерживает работу с различными форматами данных, такими как JSON и XML.


57
4

Ответы:

Вы можете использовать forEach Метод:

array2.forEach(data2 => {
    array1.forEach(data1 => {
        if (data2.name == data1.alias) data2.id = data1.id;
    })
})

const array1 = [{
    id: "40",
    alias: "Number",
    name: "Number",
  },
  {
    id: "41",
    alias: "Salary",
    name: "Salary",
  },
];


const array2 = [{
    id: "Sum__Salary__U3VtKFVTJTIwRW1wbG95ZWUuU2FsYXJ5KQ__",
    name: "Salary",
  },
  {
    id: "40",
    name: "Number"
  },
];

console.info("Before :");
console.info(array2);

array2.forEach(data2 => {
  array1.forEach(data1 => {
    if (data2.name == data1.alias) data2.id = data1.id;
  })
});

console.info("After :");
console.info(array2);

Вот решение с использованием функций высокого порядка forEach и find:

const array1 = [
  {
    id: "40",
    alias: "Number",
    name: "Number",
  },
  {
    id: "41",
    alias: "Salary",
    name: "Salary",
  },
];

const array2 = [
  {
    id: "Sum__Salary__U3VtKFVTJTIwRW1wbG95ZWUuU2FsYXJ5KQ__",
    name: "Salary",
  },
  { id: "40", name: "Number" },
];

array1.forEach((item1) => {
  const matchingItem = array2.find((item2) => item2.name === item1.alias);
  if (matchingItem) {
    matchingItem.id = item1.id;
  }
});

console.info("Modified array2:", array2);

Решено

В качестве однострочника:

a2.forEach(x => x.id = a1.find((y) => x.name===y.name)?.id ?? x.id);

const a1 = [{
    id: "40",
    alias: "Number",
    name: "Number",
  },
  {
    id: "41",
    alias: "Salary",
    name: "Salary",
  },
];


const a2 = [{
    id: "Sum__Salary__U3VtKFVTJTIwRW1wbG95ZWUuU2FsYXJ5KQ__",
    name: "Salary",
  },
  {
    id: "40",
    name: "Number"
  },
];

a2.forEach(x => x.id = a1.find((y) => x.name===y.name)?.id ?? x.id);

console.info(a2);

const temp = JSON.parse(JSON.stringify(array2))
array2.forEach((elem, index) => {
    console.info(elem?.name)
    for (let item of array1) {
        if (item.name === elem.name && item.id !== elem.id) {
            temp[index]['id'] = item.id
        }
    }
})
console.info(temp)