如何使用Underscore根据自定义排序顺序对对象数组进行排序

7

我有一个对象数组

[
  {type:"foo",elements:[...]},
  {type:"bar",elements:[...]},
  {type:"any",[...]},
  {type:"some",elements:[...]}
]

我知道如何使用underscore的_.sortBy()方法按属性“type”排序该数组。
但是现在我需要一种依赖于另一个数组的自定义排序方式:
["any","foo","some","bar"]

我的sortBy回调函数应该如何编写,以按照我的自定义顺序对对象进行排序?

1
你的自定义排序如何依赖于数组?你的数组是否已经是按类型排序好的列表? - VonD
@VonD 参考是可用类型的用户依赖排序顺序。 - ManuKaracho
1个回答

18

很容易:

_.sortBy(yourArrray, function(obj){
   return typesArray.indexOf(obj.type);
});

根据typesArrayobj.type的位置对yourArray进行排序。不在数组中的类型排在最前面。

请注意,此代码的复杂度为O(kn log n)。要改进它,请使用以下代码:

var yourTypes = {
   'any': 1,
   'foo': 2,
    'some': 3
}
_.sortBy(yourArrray, function(obj){
   return yourTypes [obj.type];
});

对象查找通常更快,导致O(1)访问(以及总体O(n log n)排序)。


完美的答案。我们只会有10种不同类型,所以在性能方面不应该有影响 - 但感谢您提供额外重要的信息! - ManuKaracho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接