我有一个如下所示的数组:
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;
}
});
但这种比较并不奏效。我的自定义比较功能有什么问题?感谢任何有用的提示。
答案 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。如果两者都没有。”