根据定义的顺序对数组进行排序

Sorting an array according to defined order

我正在尝试对数组 items 中的所有项目进行排序,以遵循 string 中指定的顺序。我正在努力让 results 成为

["first", "second", "third", "last"]

排序后。起始数组具有随机顺序。

var string = "first;second;third;last",
    items = ["third", "first", "last", "second"],
    result = [],
    lastpos = 0,
    lastinsert = 0;

for (var i = 0; i < items.length; i++) {
 var mypos = string.indexOf(items[i]),
     insertat;
 if (mypos > lastpos) {
  insertat = lastinsert
 } else {
  insertat = lastinsert + 1
 }
 result.splice(insertat, 0, items[i]);
 lastpos = mypos;
}

document.getElementById("output").innerHTML = JSON.stringify(result);
<pre id="output"></pre>

不是要求进行文本分析来对数组进行排序。该数组应仅遵循变量 string.

中项目的顺序

我假设您正在询问更多有关根据另一个数组的值/索引对数组进行排序的过程。不然就没理由排序了。

您可以尝试将 Array.prototype.sort() 与这样的东西一起使用:

var string = "first;second;third;last".split(';'),
    items = ["third", "first", "last", "second"],
    result = [];

result = items.sort(function(a,b) {
    return string.indexOf(a) - string.indexOf(b) 
});

document.getElementById("output").innerHTML = JSON.stringify(result);

这是一个 JSFiddle 示例。

--编辑--

根据评论,这应该对性能更友好:

var string = "first;second;third;last".split(';'),
    stringHash = {},
    items = ["third", "first", "last", "second"],
    result = [];    

for (var i = 0, j = string.length; i < j; i++) {
    stringHash[string[i]] = i;
}

result = items.sort(function(a,b) {
    return stringHash[a] - stringHash[b];
});

document.getElementById("output").innerHTML = JSON.stringify(result);

您将添加一个额外的步骤,因此如果原始数组很小,则可能不值得。但是,如果数组更大,这将表现得更好。

我不确定我是否理解正确,但如果您的目标只是以原始顺序获取这些元素的数组,那么最简单的方法就是从原始字符串中重新拆分:

var string = "a:test;a:second;b:third;a:last";
var result = string.split(';');

或者是否正在对那里的代码段中未描述的数据执行某些转换,这实际上需要您取消对现有数组元素的排序?