首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按Id - JavaScript对数组中的对象进行分组

按Id - JavaScript对数组中的对象进行分组
EN

Stack Overflow用户
提问于 2021-07-20 21:28:03
回答 4查看 48关注 0票数 3

我有一个对象数组,它有两个字段: id和操作权限的类型

代码语言:javascript
复制
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},
]

我想把它转换成下面的数组:

代码语言:javascript
复制
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
}
]
EN

回答 4

Stack Overflow用户

发布于 2021-07-20 21:40:30

您可以在更新Map时使用Array#reduce遍历数组,其中idkey,其结果对象是value

最后,您将拥有每个id的分组对象作为此映射中的values

代码语言:javascript
复制
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);

票数 3
EN

Stack Overflow用户

发布于 2021-07-20 21:46:47

这里有一个工作示例,它也使用array.reduce但纯对象而不是javascript Map对象。解决方案也没有缩小。

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2021-07-20 21:49:01

另一个例子,可能没有使用reduce那么优雅,但使用for of和一个地图数据类型的简单版本。

代码语言:javascript
复制
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)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68455739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档