我正在尝试对数组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
中的项的顺序。
答案 0 :(得分:2)
我假设你要求更多关于根据另一个数据/索引对数组进行排序的过程。否则,就没有理由进行排序。
您可以尝试使用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);
您将添加一个额外的步骤,因此如果原始数组很小,则可能不值得。但是,如果阵列较大,这将表现得更好。
答案 1 :(得分:0)
我不确定我是否正确理解,但如果您的目标只是按原始顺序获取这些元素的数组,那么从原始字符串重新拆分将是最简单的:
var string = "a:test;a:second;b:third;a:last";
var result = string.split(';');
&#13;
或者是否正在对那些片段中没有描述的数据执行某些转换,实际上是否需要对现有数组元素进行取消排序?