Сопоставьте два массива, чтобы увидеть, соответствует ли одно свойство, затем вставьте конкретную информацию в первый массив. - PullRequest
0 голосов
/ 12 октября 2019

плохо знаком с javascript и пытаюсь учиться! Я пытаюсь отобразить через два массива объектов, и, если определенное свойство соответствует, извлеките конкретную информацию в первый массив.

let result;

let arrNames = [{
  id: 10  
  name: "A"
}, {
  id: 11,
  name: "B"
}, {
  id: 12,
  name: "C"
}, }, {
  id: 13,
  name: "A"
}, {
  id: 14,
  name: "B"
}]

let arrInfo = [{
  name: "A",
  info: "AAA"
}, {
  name: "B",
  info: "BBB"
}, {
  name: "C",
  info: "CCC"
}]

Если arrNames.name == arrInfo.name, я хотел бы вставить информацию в массив имен.

Желаемый результат:

let arrNames = [{
  id: 10  
  name: "A",
  info: "AAA"
}, {
  id: 11,
  name: "B",
  info: "BBB"
}, {
  id: 12,
  name: "C",
  info: "CCC"
}, }, {
  id: 13,
  name: "A",
  info: "AAA"
}, {
  id: 14,
  name: "B",
  info: "BBB"
}]

What I 'мы пробовали:

const res = arrInfo.map((el, index) => {
      if(el.name == arrNames[index].name) 
        arrNames.push(el.info)
    }

^ Это, очевидно, не работает - но мне интересно, будет ли здесь уместно расширение или толчок.

Заранее благодарю за помощь (извиняюсь, чтоэто наверное дурак).

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Вы можете сделать что-то вроде этого:

let arrNames = [
  {
    id: 10,
    name: 'A'
  },
  {
    id: 11,
    name: 'B'
  },
  {
    id: 12,
    name: 'C'
  },
  {
    id: 13,
    name: 'A'
  },
  {
    id: 14,
    name: 'B'
  }
];

let arrInfo = [
  {
    name: 'A',
    info: 'AAA'
  },
  {
    name: 'B',
    info: 'BBB'
  },
  {
    name: 'C',
    info: 'CCC'
  }
];

// do this
const result = arrNames.map((item) => {
  const newItem = item; // here we define a new object that is the same as your object that is currently looped up to in your arrNames array

  // loop your second array over this currently looped to object, seeing if the name matches
  arrInfo.forEach((item2) => {
    if (item.name === item2.name) {
      newItem.info = item2.info; // if they do set a new property for your new object called info as the info from item 2 of this arrInfo array
    }
  });

  // return this new object whether or not there was a match for the name property
  return newItem; 
});

console.log(result);

Итак, с помощью метода map вы должны помнить, что нужно возвращать что-то в конце функции обратного вызова. Вы просто выдвигаете массив, что похоже на использование .map в качестве forEach. Карта превращает один массив в другой массив такой же длины. Здесь вы пытаетесь создать новый массив, в котором зацикленный элемент массива будет иметь дополнительное свойство info, если оно будет соответствовать имени вашего второго массива arrInfo.

Итак, вы можете сделать следующее:a forEach внутри вашей карты, чтобы проверить, соответствуют ли они, если это так, добавьте новое свойство к вашему элементу arrayNames и верните его как новый элемент для вашего вновь созданного массива. Надеюсь, что это помогло, пожалуйста, попросите разъяснений, если вам нужно в комментариях.

1 голос
/ 12 октября 2019

Преобразование arrInfo в Карта с ключом name. Теперь map arrNames и добавьте информацию, которую вы получаете от arrInfoMap, используя name. Используйте распространение объекта для объединения обоих объектов:

const arrNames = [{"id":10,"name":"A"},{"id":11,"name":"B"},{"id":12,"name":"C"},{"id":13,"name":"A"},{"id":14,"name":"B"}]

const arrInfo = [{"name":"A","info":"AAA"},{"name":"B","info":"BBB"},{"name":"C","info":"CCC"}]

const arrInfoMap = new Map(arrInfo.map(o => [o.name, o]))

const result = arrNames.map(o => ({ ...o, ...arrInfoMap.get(o.name) }))

console.log(result)
...