对具有唯一值的对象键的数组进行排序

Sort array for object key that holds unique value

本文关键字:数组 排序 对象 唯一      更新时间:2023-09-26

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

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"的元素,将其切片,并将其插入数组的开头。

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

所以我试试这个:

coll.sort(function(a,b){
    var itemA = a.id;
    var itemB = b.id;
    if(itemA.lastIndexOf("/DL") === 0){
        return 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.如果两者都没有,则0."

你可以试试这个:

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了。