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

时间:2015-02-08 01:59:02

标签: javascript arrays sorting splice

我正在尝试对数组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中的项的顺序。

2 个答案:

答案 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)

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

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

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

相关问题