Конвертировать массив ключ-значение с дубликатами ключей в массив объекта с уникальным ключом и свойством массива значений - PullRequest
0 голосов
/ 09 января 2019

У меня есть массив пар ключ / значение. Ключи иногда дублируются, и значения всегда уникальны для каждого ключа. Я хочу сжать каждый уникальный ключ до объекта, чтобы у меня был ключ и массив связанных значений в качестве свойства. Есть ли удобные функции JavaScript для этого?

Это

pairArray = [
{ key: "a", value: "1" },
{ key: "a", value: "2" },
{ key: "b", value: "1" },
{ key: "b", value: "2" },
];

Становится

objectArray = [
{ key: "a", values: ["1", "2"] },
{ key: "(", values: ["1", "2"] }
];

Ответы [ 2 ]

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

Вы можете использовать Map(), чтобы получить желаемый результат:

let data = [
  { key: "a", value: "1" },
  { key: "a", value: "2" },
  { key: "b", value: "1" },
  { key: "b", value: "2" },
];

let reducer = arr => {
    let map = new Map();

    arr.forEach(({key:k, value:v}) => {
        let values = map.get(k) || [];
        values.push(v);
        map.set(k, values);
    });

    return [...map.entries()].map(([k, v]) => ({key: k, values: v}));
};

console.log(reducer(data));
0 голосов
/ 09 января 2019

Вы можете просто создать карту, используя Array.reduce() с вашим key свойством вашего объекта в качестве ключа вашей карты, Object.values() на этой карте даст вам желаемый результат:

Предположим, у вас есть опечатка в ожидаемом результате. Вы можете попробовать следующее:

let pairArray =  [ { key: "a", value: "1" }, { key: "a", value: "2" }, { key: "b", value: "1" }, { key: "b", value: "2" }, ];

let result = Object.values(pairArray.reduce((acc, {key, value})=>{
  acc[key] = acc[key] || {key, values : []};
  acc[key].values.push(value);
  return acc;
},{}));

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...