Javascript AngularJS在属性上组合数组中的对象

Javascript AngularJS在属性上组合数组中的对象,javascript,angularjs,arrays,object,underscore.js,Javascript,Angularjs,Arrays,Object,Underscore.js,我有一个大的对象数组(1500+),对象匹配其中一个属性。因此,可以减少对象的总数,例如,在ng repeat中获得更好的性能。 我对AngularJS和JS本身有点陌生,所以非常感谢您的帮助 我的对象数组(简化) 所需输出 dreamArray = [ { "role": "user111", "operation": { "create": ["folder", "task"], "delet

我有一个大的对象数组(1500+),对象匹配其中一个属性。因此,可以减少对象的总数,例如,在ng repeat中获得更好的性能。 我对AngularJS和JS本身有点陌生,所以非常感谢您的帮助

我的对象数组(简化)

所需输出

dreamArray = [
    {
        "role": "user111",
        "operation": {
               "create": ["folder", "task"],
               "delete": ["task"]
                      }
    },
    {
        "role": "user222",
        "operation": {
                   "create": ["folder", "task"],
                   "delete": ["task"]
                      }
    }
]

您可以使用哈希表并存储对组的引用

var数组=[{role:“user111”、操作:“create”、概念:“folder”}、{role:“user111”、操作:“create”、概念:“task”}、{role:“user222”、操作:“create”、概念:“folder”}、{role:“user222”、操作:“create”、概念:“task”}、{role:“user222”、操作:“删除”,概念:“任务”}],
分组=数组.reduce(函数(散列){
返回函数(r,o){
如果(!哈希[o.role]){
hash[o.role]={};
r、 push({role:o.role,operation:hash[o.role]});
}
散列[o.role][o.operation]=散列[o.role][o.operation]| |[];
hash[o.role][o.operation].push(o.concept);
返回r;
};
}(Object.create(null)),[]);
console.log(分组);

.as console wrapper{max height:100%!important;top:0;}
您可以使用
forEach()
循环和
thisArg
参数执行此操作

var myArray=[{“角色”:“用户111”,“操作”:“创建”,“概念”:“文件夹”},{“角色”:“用户111”,“操作”:“创建”,“概念”:“任务”},{“角色”:“用户111”,“操作”:“删除”,“概念”:“任务”},{“角色”:“用户222”,“操作”:“创建”,“概念”:“任务”},{“文件夹”},{“角色”:“用户222”,“操作”:“创建”,“概念”:“任务”},{“角色”:“用户222”,“操作”:“删除”概念“:“任务”}]
var结果=[];
myArray.forEach(函数(e){
如果(!此[e.role]){
此[e.role]={role:e.role,操作:{[e.operation]:[e.concept]}
结果推送(这个[e.角色]);
}否则{
var op=此[e.role]。操作[e.operation]
if(op)op.push(e.concept)
否则此[e.role]。操作[e.operation]=[e.concept]
}
},Object.create(空))
使用
reduce()
find()


正如我在评论中提到的,如果您碰巧收到已在
角色
属性(您这么说)上排序的数据,那么所需的操作可以归结为一个非常简单的
.reduce()
操作,并且可以按O(n)时间复杂度实现,如下所示:;
var data=[{“角色”:“用户111”,“操作”:“创建”,“概念”:“文件夹”},{“角色”:“用户111”,“操作”:“创建”,“概念”:“任务”},{“角色”:“用户111”,“操作”:“删除”,“概念”:“任务”},{“角色”:“用户222”,“操作”:“创建”,“概念”:“文件夹”},{“角色”:“用户222”,“操作”:“创建”,“概念”:“任务”},{“角色”:“用户222”,“操作”:“删除”概念“:“任务”}],
结果=数据.reduce((r,c,i)=>!i | | r[r.length-1]。role!==c.role?r.concat({“role”:c.role,“operation”:c.operation==“create”?{“create”:[c.concept],“delete”:[]}
:{“创建”:[],“删除”:[c.concept]})
:r[r.length-1]。操作[c.operation]。包括(e=>e==c.concept)?r
:(r[r.length-1]。操作[c.operation]。推送(c.concept),r),[]);
console.log(结果);

.as console wrapper{max height:100%!important;top:0;}
您是否总是像示例数据中那样接收按
角色
属性排序的对象?如果是这样,这是一个有价值的信息,可以大大简化代码。@Redu事实上我是这样做的!这将如何简化事情?那么您可以在O(n)中这样做通过使用单个
.reduce()
操作来计算时间。请参阅下面我的答案。
dreamArray = [
    {
        "role": "user111",
        "operation": {
               "create": ["folder", "task"],
               "delete": ["task"]
                      }
    },
    {
        "role": "user222",
        "operation": {
                   "create": ["folder", "task"],
                   "delete": ["task"]
                      }
    }
]
var myArray = [{ role: "user111", operation: "create", concept: "folder" }, { role: "user111", operation: "create", concept: "task" }, { role: "user111", operation: "delete", concept: "task" }, { role: "user222", operation: "create", concept: "folder" }, { role: "user222", operation: "create", concept: "task" }, { role: "user222", operation: "delete", concept: "task" }],

const dreamArray = myArray.reduce((acc, item) => {
    let obj = acc.find(e => e.role === item.role);
  if(!obj){
    obj = {"role" : item.role, "operation": {[item.operation]: [item.concept]}};
    acc.push(obj);
  }else{
    obj.operation[item.operation] = obj.operation[item.operation] || [];
    obj.operation[item.operation].push(item.concept);
  }
  return acc;
}, []);

console.log(dreamArray);