Javascript AngularJS在属性上组合数组中的对象
我有一个大的对象数组(1500+),对象匹配其中一个属性。因此,可以减少对象的总数,例如,在ng repeat中获得更好的性能。 我对AngularJS和JS本身有点陌生,所以非常感谢您的帮助 我的对象数组(简化) 所需输出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
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);