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

#javascript #arrays #node.js #object

#javascript #массивы #node.js #объект

Вопрос:

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

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

 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 символов значений ссылок, найти совпадение в массиве 2 Ref (только первые 9 символов идентичны). При совпадении вставьте «Стиль» из array2 в соответствующий объект в array1

Я пытался с 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"
  }
]
  

Комментарии:

1. Следует ли вам сопоставлять, Global_Stylecode если в первом массиве нет Ref свойства?

2. Я изменил Global_Stylecode на ref, чтобы быть менее запутанным 🙂

Ответ №1:

Предполагая, что все эти свойства должны быть 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.log(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.log(out);  

Комментарии:

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

Ответ №2:

 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.log(Object.values(arrMap));
  

Комментарии:

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

Ответ №3:

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

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

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

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

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

Комментарии:

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

Ответ №4:

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

 var newArr = []

for(let k in array1){
  for(let i in array2){
    console.log(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)
      }
  }
}
  

Комментарии:

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

Ответ №5:

Первое решение немного сложное. Вероятно, у вас опечатка в 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 все будет в порядке.

Комментарии:

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