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

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);

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
57
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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? ищете упрощенный синтаксис. Можем ли мы добиться этого с помощью сокращения?

Sameer 24.08.2024 09:06

@Sameer, единственный способ избежать вложенного цикла — это сначала создать объект поиска из массива1 {Зарплата:41, Номер:40..}, а затем использовать его в массиве2 foreach. но поскольку ваши массивы малы, вложенный цикл не так уж и плох

cmgchess 24.08.2024 09:35

что-то вроде этого я имел в виду const lookupMap = array1.reduce((acc,curr) =>(acc[curr.alias] = curr.id,acc),{}); и array2.forEach(e => e.id = lookupMap[e.name]);

cmgchess 24.08.2024 09:41

@cmgchess спасибо!

Sameer 24.08.2024 09:51

Вот решение с использованием функций высокого порядка 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)

Другие вопросы по теме