对包含唯一值的对象键的数组进行排序

时间:2016-04-15 18:26:45

标签: javascript arrays

我有一个如下所示的数组:

var coll = [
{
    prop1:true,
    prop2:false,
    id:"888399"
},
{
    prop1:true,
    prop2:true,
    id:"/XS-555224"
},
{
    prop1:false,
    prop2:false,
    id:"/DL-555444"
}
]

我想对数组进行排序,以便ID为" / DL" (总是只有一个)始终从顶部开始。我怎么做?

我不觉得自定义排序将是最佳选择,因为我不必相互比较元素,我只需要找到带有" / DL&#的那个34;,将其切片,然后将其插入数组的开头。

但是,要做到这一点,我仍然需要迭代数组的每个元素以找到元素,然后执行几个操作。那么我开始想我也可以这样做。问题是如何编写正确的条件来比较2个项目并检查ID字符串的开头。所以我认为我可以简单地测试String的开头并自己返回值而不进行比较。

所以我试试这个:

coll.sort(function(a,b){
    var itemA = a.id;
    var itemB = b.id;

    if(itemA.lastIndexOf("/DL") === 0){
        return 1;
    }
});

但这种比较并不奏效。我的自定义比较功能有什么问题?感谢任何有用的提示。

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

var orderedArr = coll.sort(function(val){
    return !val.id.toString().startsWith('/DL');
});

[编辑]

一旦你拥有IE用户,你可以添加它以使你的生活更轻松:

if (!String.prototype.startsWith) {
   String.prototype.startsWith = function(searchString, position) {
       position = position || 0;
       return this.indexOf(searchString, position) === position;
   };
}

所以你现在可以随时随地使用startsWith。

答案 1 :(得分:1)

即使您只是想要将一条记录移到前面,您仍然需要检查排序中的两个参数,它可以是一个。

coll.sort(function(a,b) {
  return a.id.indexOf('/DL') === 0 ? -1 : b.id.indexOf('/DL') === 0 ? 1 : 0;   
});

基本上我们希望'/ DL'记录成为数组中的“最低”值,因此它将首先显示(排序顺序从低到高)。如果a较低,则返回否定,如果b较低,则返回正数。因此,当排序a是/ DL时,我们需要返回负数。如果b是/ DL,我们会返回正数。所以英语中的这个表达式基本上是“a是我们的记录吗?-1。如果不是,b是我们的记录吗?1。如果两者都没有。”