我有两个数组。我应该对一个(降序或升序)进行正常排序,并根据第一个数组的排序方式对另一个进行排序。这是因为第一个数组中的每个元素都与第二个数组上的相同索引元素有关系,我必须保持这种关系为真。例如:
sortThis=[3,1,2];
sortAccording=["With 3","With 1","With 2];
我找不到任何方法从 JavaScript 的sort
函数中获取索引更改。
我有两个数组。我应该对一个(降序或升序)进行正常排序,并根据第一个数组的排序方式对另一个进行排序。这是因为第一个数组中的每个元素都与第二个数组上的相同索引元素有关系,我必须保持这种关系为真。例如:
sortThis=[3,1,2];
sortAccording=["With 3","With 1","With 2];
我找不到任何方法从 JavaScript 的sort
函数中获取索引更改。
解决方案: 要实现这一点,您必须将两个数组压缩为一个。这是,假设你有这两个数组:
sortThis=[3,1,2];
sortAccording=["With 3","With 1","With 2];
压缩它们后,您将拥有以下数组:
zipped = [{a: 3, b: "With 3"}, {a: 1, b: "With 1"}, {a: 2, b: "With 2"}];
然后,您按a对其进行排序以获得:
zippedAndSorted = [{a: 1, b: "With 1"}, {a: 2, b: "With 2"}, {a: 3, b: "With 3"}];
接下来是什么?
好吧,一旦你按照你想要的排序了这个数组,你必须使用map函数提取它们的值,最后你将让你的两个数组按照相同的标准排序:
编码:
// your arrays
sortThis=[3,1,2];
sortAccording=["With 3","With 1","With 2"];
// the zip function
function zip(a,b) {
return a.map(function(aa, i){ return { i: aa, j: b[i]};} )
};
// ziping and sorting the arrays
var zipped = zip(sortThis, sortAccording);
zippedAndSorted = zipped.sort(function(a,b){ return a.i - b.i; });
// your two sorted arrays
sortedThis = zippedAndSorted.map(function(a){ return a.i;});
sortedAccording = zippedAndSorted.map(function(a){ return a.j;});
你也可以看到它在这里工作:http: //jsfiddle.net/lontivero/cfpcJ/
祝你好运!
例如:
function zip(a, b) {
var i = 0, j = 0, r = [];
while(i < a.length && j < b.length)
r.push([a[i++], b[j++]]);
return r;
}
function unzip(r) {
var a = [], b = [];
for(var i = 0; i < r.length; i++) {
a.push(r[i][0]);
b.push(r[i][1]);
}
return [a, b];
}
r = zip(sortAccording, sortThis);
r.sort();
r = unzip(r);
sortAccording = r[0]
sortThis = r[1]
另一种方式:
result = sortAccording.
map(function(elem, pos) { return [elem, pos]}).
sort().
map(function(elem) { return sortThis[elem[1]]})
更好的 zip 和 unzip 实现(都使用可变数量的参数):
zip = function() {
var args = [].slice.call(arguments, 0);
return args[0].map(function(_, i) {
return args.map(function(a) {
return a[i]
})
})
}
unzip = function(a) {
return a[0].map(function(_, i) {
return a.reduce(function(y, e) {
return y.concat(e[i])
}, [])
})
}
我有一个简单的解决方案。创建第三个索引数组。只需根据第一个数组的排序对该索引数组进行排序。
var indexArray = [];
for (var i=0; i < sortThis.length; i++) {
indexArray[i] = i;
}
indexArray.sort(function(a, b) {
return (sortThis[a] > sortThis[b]) ? 1 : (sortThis[a] === sortThis[b]) ? 0 : -1;
});
// Now you have the sorted index ready
console.log("The first elements in the arrays are: " + sortThis(indexArray[0]) + " and " + sortAccording(indexArray[0]));