将具有重复键的键值数组转换为具有唯一键和value数组属性的对象数组

时间:2019-01-09 05:52:38

标签: javascript arrays object key-value

我有一组键/值对。这些键有时是重复的,并且每个键的值始终是唯一的。 我想将每个唯一键压缩为一个对象,以便将一个键和一组关联值作为属性。 有任何方便的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 :(得分:2)

您可以简单地使用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);

答案 1 :(得分:0)

您可以使用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));

相关问题