将具有重复键的键值数组转换为具有唯一键和值数组 属性 的对象数组
Convert a key-value array with duplicate keys into array of object with unique key, and value array property
我有一组 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"] }
];
您可以简单地使用 Array.reduce()
创建一个地图,并将您对象的 key
属性 作为地图的键,该地图上的 Object.values()
将为您提供期望的结果:
假设您的预期输出有错字。您可以尝试以下操作:
const pairArray = [ { key: "a", value: "1" }, { key: "a", value: "2" }, { key: "b", value: "1" }, { key: "b", value: "2" }, ];
const result = Object.values(pairArray.reduce((acc, {key, value})=>{
acc[key] = acc[key] || {key, values : []};
acc[key].values.push(value);
return acc;
},{}));
console.log(result);
您可以使用 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));
我有一组 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"] }
];
您可以简单地使用 Array.reduce()
创建一个地图,并将您对象的 key
属性 作为地图的键,该地图上的 Object.values()
将为您提供期望的结果:
假设您的预期输出有错字。您可以尝试以下操作:
const pairArray = [ { key: "a", value: "1" }, { key: "a", value: "2" }, { key: "b", value: "1" }, { key: "b", value: "2" }, ];
const result = Object.values(pairArray.reduce((acc, {key, value})=>{
acc[key] = acc[key] || {key, values : []};
acc[key].values.push(value);
return acc;
},{}));
console.log(result);
您可以使用 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));