javascript - 按属性组合对象数组

标签 javascript lodash

您好,我正在尝试组合一个对象数组,并且需要最终结果是一个对象数组,其中一个属性是唯一的,另一个是包含原始属性中第二个属性的所有值的数组

我有数组:

let arr = [
    { 
        name: 'cdd_register', 
        levels: 'read' 
    }, { 
        name: 'cdd_register', 
        levels: 'write' 
    }, { 
        name: 'annual_reports', 
        levels: 'write' 
    }
];

我期望的结果是:

let result = [
    { 
        name: 'cdd_register', 
        levels: ['read', 'write']
    }, { 
        name: 'annual_reports', 
        levels: 'write' 
    }
];

我从后端收到此响应

data: [{
    id:1
    label: "Administrator"
    name: "admin"
    permissions:{
        data: [{
            id: 4, 
            name: "cdd_register.read", 
            label: "Read access on CDD Register module"
        }, {
            id: 6, 
            name: "cdd_register.write", 
            label: "Write access on CDD Register module"
        }, {
            id: 7, 
            name: "annual_reports.write", 
            label: "Write access on Annual Reports module"
        }]
    }
}]

在此之后

getModules(roles) {
    let modules = [];

    _.forEach(roles, role => {
        _.forEach(role.permissions.data, permission => {
            modules.push(permission);
        })
    });

    return _.uniqBy(modules, 'id').map(module => {
        let moduleArray = module.name.split('.');
            return {
                 name: moduleArray[0],
                 levels: moduleArray[1]
            }
        });
    }
}

我得到了现在的结果,但无法找出最好的方法(干净)。

谢谢。

最佳答案

这可以通过多种不同的方式来完成。一种可能的方法是使用一些功能魔法

let arr = [{
  name: 'cdd_register',
  levels: 'read'
}, {
  name: 'cdd_register',
  levels: 'write'
}, {
  name: 'annual_reports',
  levels: 'write'
}];

let result = arr.reduce((acc, x) => {
  const found = acc.find(y => (x.name == y.name));
  if (!found) {
    acc.push({
      name: x.name,
      levels: arr
        .filter(y => (x.name == y.name))
        .map(z => (z.levels))
    });
  }
  return acc;
}, [])

console.log(result)

关于javascript - 按属性组合对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47614100/

相关文章:

javascript - 如何从另一个函数返回一个函数然后调用它?

javascript - 将下拉列表 ul 列表在下拉导航顶部的相同高度对齐

arrays - Typescript 是否能够理解数组是否非空并相应地推断某些数组方法的类型?

Javascript reduce 给出了不正确的值

javascript - 如何正确使用 redux-form 的 debounce?

javascript - 选择列表项值不适用于 Javascript asp mvc

javascript - Vue.js 引用未定义,即使 this.$refs 显示它们在那里

javascript - Webpack 监视模式不适用于 html-webpack 和 clean-webpack 插件

javascript - React js hooks lodash 设置奇怪的行为

arrays - 使用Lodash从对象/值中删除键