JS -применить ключ к соответствующему массиву, значениям объекта - PullRequest
0 голосов
/ 09 апреля 2019

Я бы хотел передать значения ключа к объектам в массиве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 символов идентичны).Когда есть совпадение, нажмите «Style» из 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"
  }
]

Ответы [ 5 ]

1 голос
/ 09 апреля 2019

Предполагая, что все эти свойства имеют значение 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);
0 голосов
/ 09 апреля 2019

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

0 голосов
/ 09 апреля 2019

Нечто подобное может быть тем, что вы хотите:

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

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

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

0 голосов
/ 09 апреля 2019

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

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)
      }
  }
}
0 голосов
/ 09 апреля 2019
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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...