我有一个对象数组,它有两个字段: id和操作权限的类型
const array=[
{view: false, id: 1},
{create: false, id: 1},
{read: false, id: 1},
{update: false, id: 1},
{delete: false, id: 1},
{view: false, id: 2},
{create: false, id: 2},
{read: false, id: 2},
{update: false, id: 2},
{delete: false, id: 2},
]我想把它转换成下面的数组:
const permissions=[
{
id: 1,
view: false,
read: false,
create: false,
delete:false,
update:false
},
{
id: 2,
view: false,
read: false,
create: false,
delete:false,
update:false
}
]发布于 2021-07-20 21:40:30
您可以在更新Map时使用Array#reduce遍历数组,其中id是key,其结果对象是value。
最后,您将拥有每个id的分组对象作为此映射中的values:
const array = [
{view: false, id: 1},
{create: false, id: 1},
{read: false, id: 1},
{update: false, id: 1},
{delete: false, id: 1},
{view: false, id: 2},
{create: false, id: 2},
{read: false, id: 2},
{update: false, id: 2},
{delete: false, id: 2},
];
const res = [...
array.reduce((map, { id, ...elem }) =>
map.set(id, { ...(map.get(id) || { id }), ...elem })
, new Map)
.values()
];
console.log(res);
发布于 2021-07-20 21:46:47
这里有一个工作示例,它也使用array.reduce但纯对象而不是javascript Map对象。解决方案也没有缩小。
const data = [
{ view: false, id: 1 },
{ create: false, id: 1 },
{ read: false, id: 1 },
{ update: false, id: 1 },
{ delete: false, id: 1 },
{ view: false, id: 2 },
{ create: false, id: 2 },
{ read: false, id: 2 },
{ update: false, id: 2 },
{ delete: false, id: 2 },
]
const merged = data.reduce((prev, current) => {
// get the id.
// make it to string as we use it as key and not index!
const id = '' + current.id
// create object if it does not already exist:
if (!prev[id]) {
prev[id] = {}
}
// store the given data, merge it with already
// existing data under the id
prev[id] = {
...prev[id],
...current
}
// return the results.
return prev
}, {})
// now that we have merged togehter the objects,
// extract them and push em together to an array:
const results = Object.keys(merged).map(k => merged[k])
console.log('results', results)发布于 2021-07-20 21:49:01
另一个例子,可能没有使用reduce那么优雅,但使用for of和一个地图数据类型的简单版本。
const array = [{
view: false,
id: 1
}, {
create: false,
id: 1
}, {
read: false,
id: 1
}, {
update: true,
id: 1
}, {
delete: false,
id: 1
}, {
view: false,
id: 1
}, {
create: false,
id: 1
}, {
read: false,
id: 1
}, {
update: false,
id: 1
}, {
delete: false,
id: 1
}]
const perm = {}
for(let el of array){
const {id} = el
perm[id] = perm[id] ? {...perm[id], "id": id} : {"id": id}
for(let key in el){
if(key === 'id'){
continue
}
perm[id] = {...perm[id], [key]: el[key]}
}
}
console.log("Permissions Map:", perm)
const permissionsArray = Object.values(perm)
console.log("Permissions Array:",permissionsArray)
https://stackoverflow.com/questions/68455739
复制相似问题