刚在我正在编写的一些代码中偶然发现了这种情况,并对“正确”的方法感到好奇。举例来说,我有很多对象,需要按某个属性对其进行分组,但是分组的顺序很重要。
前任。对象:
var obj = {
"groupName" : ["Group1", "Group2" ]
}
因此,如果我在一个数组中有一堆这些对象,那么遍历每个对象,遍历其groupName属性,检查另一个数组(例如“ groups”)以查看该组是否存在(如果不创建该组)并添加对象就很烦人了。 。
是否有一个名为组的对象具有与组名称匹配的属性,是否有意义,将对象以这种方式分组,然后最后将组转换为数组(自然使用组中的某种优先级字段进行排序)是否有意义?
前任。
var groups = {
"Group1": {
"precedence":1,
"objArray": []
}
}
然后,您可以像这样进行分组,对objs数组执行一次forEach,对obj.groupnames执行forEach,如果组中的组名将obj推入,否则groups.groupname是一个新组,请从查找表中获得优先级,然后将obj推入该组。
最后,枚举groups的所有props并添加到groupsArray中,然后按优先级排序。
这比仅使用数组更有效率吗?不太有意义?有一个更好的方法吗?我使用上面的方法进行工作,从更多的理论意义上来说,我只是在好奇这是否是常见的做法,而不是效率低下和笨拙的:P。
谢谢!
编辑:
可以更好地解释事物的开始/结束结果:
var obj1 = {
"groupsIBelongTo" : ["A", "B"];
};
var obj2 = {
"groupsIBelongTo" : ["B", "C"];
};
var obj3 = {
"groupsIBelongTo" : ["A", "C"];
};
var objArray = [ obj1, obj2, obj3];
我想创建一个包含适当的obj的组的数组。假设优先级为B,A,C,则最终结果应为:
var groups = [ {
"groupName" : "B",
"objs" : [obj1, obj2]
},
{
"groupName" : "A",
"objs" : [obj1, obj3]
},
{
"groupName" : "C",
"objs" : [obj2, obj3]
},
]
我建议阅读Mozilla开发人员网络上的阵列页面。它们提供了丰富的知识和示例。这是一个相当复杂的问题,因此为了清晰起见,它分为多个步骤。这是演示。
var objArray = [obj1, obj2, obj3];
var hash = sortOrder.reduce(function(hash, key) {
hash[key] = objArray.filter(function(item) {
return (item['groupsIBelongTo'].indexOf(key) > -1);
});
return hash;
}, {});
然后,使用“排序顺序”列表,可以创建对象。
var sortOrder = ['B', 'A', 'C'];
var result = sortOrder.map(function(group) {
return {
'groupName': group,
'objs': hash[group]
};
});
编辑:更改为使用过滤器以减少所需的代码量。
如果要提高效率,则必须更加具体,因为引擎之间的JavaScript性能有所不同。使用for
循环或while
循环会更快比使用map
,reduce
和sort
。但是,这仅是15%的让步-至少根据我的浏览器而言。就像另一篇文章所暗示的那样,始终最好是通过编码来使代码变得更加聪明。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句