根据定义的顺序对数组进行排序
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(';');
或者是否正在对那里的代码段中未描述的数据执行某些转换,这实际上需要您取消对现有数组元素的排序?
我正在尝试对数组 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(';');
或者是否正在对那里的代码段中未描述的数据执行某些转换,这实际上需要您取消对现有数组元素的排序?