在Javascript中以定义的顺序排序字符串数组的最佳方法?

时间:2015-12-18 13:28:46

标签: javascript arrays string

我有一个字符串数组,我想用字符串本身和我预先定义的顺序来订购。

所以数组可以是:

['text4', 'image2', 'text1', 'text3', 'image1']

预先定义的顺序是:

text1,image1,text2,image2,text3,image3,text4,image4,text5,image5

所以有序数组应如下所示:

['text1', 'image1', 'image2', 'text3', 'text4']

正如您所看到的,原始数组不必以预定义的顺序包含每个可能的字符串。

我能想到这样做的方法是循环遍历数组,看看是否有' text1'如果有,请将其放入有序数组中。并以预定义的顺序为每个字符串执行此操作。但有没有更好更简洁的方法呢?

谢谢。

3 个答案:

答案 0 :(得分:2)

有一个内置的sort数组方法可以对数组进行排序。默认情况下,它按字母顺序将所有条目排序为字符串。但是,您可以使用排序条件传递回调函数。

对于您的特定情况,可以这样做:

['text4', 'image2', 'text1', 'text3', 'image1'].sort(function(a, b) {
    return a.slice(-1) > b.slice(-1);
});

它将根据最后一个字符对所有条目进行排序。如果您的条目以更多数字结尾,则必须更改函数以将其考虑在内。

我希望这个例子可以帮助你。

编辑:

由于默认排序功能会按字母顺序对它们进行排序,因此image将位于text之前。这意味着在应用上述函数之前,您必须在初始排序后reverse数组。例如:

var ary = ['text4', 'image2', 'text1', 'text3', 'image1'];
ary.sort();
ary.reverse();
// here comes the custom sorting

答案 1 :(得分:0)

尝试:

var a = ['text4', 'image2', 'text1', 'text3', 'image1'];
var store = [];
for (var i = 0, len = a.length; i < len; i++) {
    var sortnr = (100 - parseFloat(a[i]))) + a[i];
    store.push([sortnr, a[i]]);
}
store.sort(function (x, y) {
    return x[0] < y[0] ? 0 : -1;
});
for (var i = 0, len = store.length; i < len; i++) {
    a[i] = store[i][1];
}
store = null;

答案 2 :(得分:0)

创建比较函数并使用常规排序功能并不难:

&#13;
&#13;
var sorted = ['text4', 'image2', 'text1', 'text3', 'image1'].sort(function(a, b) {
  var numPartA = +(a.match(/\d+$/)[0]);
  var numPartB = +(b.match(/\d+$/)[0]);
    if(numPartA !== numPartB) {
      return numPartA - numPartB;
    }
    return a > b ? -1 : 1;
  });

document.write(sorted);
&#13;
&#13;
&#13;

基本上我们将数字部分隔离开来并用于排序。当相等时,我们默认为字符串排序,但是反向顺序,因为&#34; text&#34;来自&#34; image&#34;按字母顺序