Поиск подходящего массива oject свойства - PullRequest
0 голосов
/ 07 марта 2020

У меня есть два массива:

var scores = [{ name: "Bob", score: 19 }, { name: "Harry", score: 27 }, { name: "Janelle", score: 35 }];

var ranks = [{ name: "Bob", rank: 3 }, { name: "Harry", rank: 2 }, { name: "Janelle", rank: 1 }];

Я хочу объединить два массива и добавить «ранг» ко всем соответствующим массивам без повторяя «имя». Так же, как INDEX MATCH в Excel.

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Вы можете создать функцию с именем mergeArrays, которая принимает исходный массив, целевой массив и ключ для сопоставления элементов массива. Используя Array.map, выполните итерацию по массиву source, затем, когда будет найден элемент массива destination с тем же значением key, присвойте значения объекта и верните карту. Обратите внимание, что это не только присвоит rank массиву source, но и все значения в массиве destination. Похоже, что в примере rank является единственным отличающимся свойством, это не должно быть проблемой.

Пример Repl

var scores = [
  { name: "Bob", score: 19 }, 
  { name: "Harry", score: 27 }, 
  { name: "Janelle", score: 35 }
]

var ranks = [
  { name: "Bob", rank: 3 }, 
  { name: "Harry", rank: 2 }, 
  { name: "Janelle", rank: 1 }
]

const mergeArrays = (source, destination, key) => {
  return scores.map((score) => {
    let rank = ranks.find((rank) => rank[key] === score[key])
    return Object.assign(score, rank)
  })
}

console.log(mergeArrays(scores, ranks, 'name'))
0 голосов
/ 08 марта 2020

Go через оба массива и построить один объект с уникальными ключами name и накапливать значения. Используйте Object.values для значений в виде массива.

var scores = [
  { name: "Bob", score: 19 },
  { name: "Harry", score: 27 },
  { name: "Janelle", score: 35 }
];

var ranks = [
  { name: "Bob", rank: 3 },
  { name: "Harry", rank: 2 },
  { name: "Janelle", rank: 1 }
];

const merge = (arr1, arr2) => {
  const res = {};
  [...arr1, ...arr2].forEach(item =>
    Object.assign(res, { [item.name]: { ...res[item.name], ...item } })
  );
  return Object.values(res);
};

console.log(merge(scores, ranks));
...