JS - Добавить ключ к соответствующему массиву, значения объекта

Я хотел бы передать значения ключей объектам в массиве1 из других объектов массива2

Для этого нужно найти соответствующие значения в обоих массивах, а затем нажать правую клавишу.

let array1 = [
  {
    "Ref": "28189-060-B",
    "Otherkey": "Whatever"
  },
  {
    "Ref": "18182-250-B",
    "Otherkey": "Whatever2"
  },
  {
    "Ref": "55187-753-B",
    "Otherkey": "Whatever3"
  }
]

let array2 = [
  {
    "Ref": "28189-060-ABCD",
    "Style": "Red"
  },
  {
    "Ref": "18182-250-ABCD",
    "Style": "Blue"
  },
  {
    "Ref": "55187-753-ABCD",
    "Style": "Yellow"
  }
]

Функция должна перебрать все объекты в массиве1, просмотреть первые 9 символов значений Ref, найти совпадение в массиве2 Ref (только первые 9 символов идентичны). Когда есть совпадение, нажмите «Стиль» из массива2 в соответствующий объект в массиве1.

Я пытался с Object.key.foreach(), map(), с substr получить только 9 символов, с find()... все это было большим беспорядком и не работало...

Ожидаемый результат :

let array1 = [
    {
    "Ref": "18182-250-B",
    "Otherkey": "Whatever2",
    "Style": "Blue"
  },
{
    "Ref": "28189-060-B",
    "Otherkey": "Whatever",
    "Style": "Red"
  },
  {
    "Ref": "55187-753-B",
    "Otherkey": "Whatever3",
    "Style": "Yellow"
  }
]

Должны ли вы сопоставлять Global_Stylecode, если в первом массиве нет свойства Ref?

Vladimir Bogomolov 09.04.2019 09:52

Я изменил Global_Stylecode на ref, чтобы было менее запутанно :)

NuoNuo LeRobot 09.04.2019 13:38
Поведение ключевого слова "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) для оценки ваших знаний,...
0
2
1 246
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

var arrMap = {};
array1.forEach(function(x){
    if (!arrMap[x.Ref.substring(0,9)]){
        arrMap[x.Ref.substring(0,9)] = x;
    }
});

array2.forEach(function(x){
 if (Object.keys(arrMap).includes(x.Ref.substring(0,9))){
        arrMap[x.Ref.substring(0,9)] = Object.assign(arrMap[x.Ref.substring(0,9)], {"Style": x.Style});
    }
});
console.info(Object.values(arrMap));

Спасибо за ваш ответ !

NuoNuo LeRobot 09.04.2019 17:11

Что-то вроде этого может быть тем, что вы хотите:

array1.forEach(function (element1) {
    array2.forEach(function (element2){
        addStyle(element1, element2);        
    });
});

function addStyle(obj1, obj2){
    if (obj1.Ref && obj2.Ref){
        let Ref1 = obj1.Ref.substr(0,8);
        let Ref2 = obj2.Ref.substr(0, 8);
        if (Ref1 === Ref2){
            obj1.Style = obj2.Style;
        };
    }
 }

Таким образом, мы перебираем первый массив и для каждого элемента перебираем второй массив.

Затем мы проверяем, присутствуют ли ожидаемые поля, и если да, то сравниваем их. Если они совпадают, мы добавляем поле «Стиль» и переходим к следующему объекту.

Спасибо за ваш ответ !

NuoNuo LeRobot 09.04.2019 17:11

Приведенный ниже код будет работать, хотя мы могли бы оптимизировать его дальше.

var newArr = []

for(let k in array1){
  for(let i in array2){
    console.info(array2[i]['Ref'].substr(0,9))

      if (array1[k]['Ref'].substr(0,9) == array2[i]['Ref'].substr(0,9)){
          let temp = array1[k]
          temp['Style'] = array2[i]['Style']
          newArr.push(temp)
      }
  }
}

Спасибо за ваш ответ !

NuoNuo LeRobot 09.04.2019 17:12

Первое решение немного сложное. Вероятно, у вас опечатка в array1, так как ваш первый ключ не согласован. вместо Global_Stylecode вы, вероятно, имели в виду Ref, В любом случае, скорее всего, у него должен быть такой же ключ. Если предположить, что ключ Ref, то

    array1.forEach( ({Ref: Ref1, Otherkey}, index) => {
      const Ref1Sub = Ref1.substring(0, 9);
      array2.forEach(({Ref: Ref2, Style}) => {
        if (Ref2.includes(Ref1Sub)) {
          array1[index].Style = Style;
        }
      })
    });

Также нет необходимости определять массивы как let. const будет хорошо.

Спасибо за ваш ответ !

NuoNuo LeRobot 09.04.2019 17:12
Ответ принят как подходящий

Предполагая, что все эти свойства должны быть Ref (некоторые Global_Style), вы можете использовать forEach и find:

let array1 = [{"Ref":"28189-060-B","Otherkey":"Whatever"},{"Ref":"18182-250-B","Otherkey":"Whatever2"},{"Ref":"55187-753-B","Otherkey":"Whatever3"}];
let array2 = [{"Ref":"28189-060-ABCD","Style":"Red"},{"Ref":"18182-250-ABCD","Style":"Blue"},{"Ref":"55187-753-ABCD","Style":"Yellow"}];

const shorterRef = (ref) => ref.substr(0, 9);

array1.forEach(obj => {
  const a1Ref = shorterRef(obj.Ref);
  const arr2Obj = array2.find(tmp => shorterRef(tmp.Ref) === a1Ref);
  if (arr2Obj) obj.Style = arr2Obj.Style;
});

console.info(array1);

Если вы не хотите изменять массив, используйте map:

let array1 = [{"Ref":"28189-060-B","Otherkey":"Whatever"},{"Ref":"18182-250-B","Otherkey":"Whatever2"},{"Ref":"55187-753-B","Otherkey":"Whatever3"}];
let array2 = [{"Ref":"28189-060-ABCD","Style":"Red"},{"Ref":"18182-250-ABCD","Style":"Blue"},{"Ref":"55187-753-ABCD","Style":"Yellow"}];

const shorterRef = (ref) => ref.substr(0, 9);

const out = array1.map(obj => {
  const a1Ref = shorterRef(obj.Ref);
  const arr2Obj = array2.find(tmp => shorterRef(tmp.Ref) === a1Ref);
  if (arr2Obj) return { ...obj,  Style: arr2Obj.Style };
});

console.info(out);

Вау, это ужин, интересно узнать, как это работает, мне понравился ваш ответ, потому что он понятен для новичка, и я узнаю отличные вещи, большое спасибо!

NuoNuo LeRobot 09.04.2019 17:11

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

Похожие вопросы

Метод фильтрации массива для сопоставления идентификаторов и проверки существования свойств
Как вставить данные в базу данных sqlite, используя общую функцию
Редактор форматированного текста отображается неправильно
Как отправлять и получать данные без перезагрузки страницы
Отключение позиции: исправлено при прокрутке, когда 250 пикселей от нижней части страницы
Для большего количества данных во временном ряду highchart вычисляет среднее значение
Как нарисовать строку из последовательных точек массива в openlayers
Перебирая массив строк, найдите две строки с наибольшим перекрытием и объедините их. ПОВТОРЯЙТЕ, пока не останется одна струна
Как отключить всплывающее окно «Перезагрузить сайт? Внесенные вами изменения могут быть не сохранены» для тестов селена (python) в chrome?
Почему это не рекомендуется для проверки массива lengthOf() в chai?