根据另一个数组的排序索引对数组进行排序

时间:2012-12-22 15:53:20

标签: javascript

我有两个数组。我应该在一个(降序或升序)上进行正常排序,并根据第一个数组的排序方式对另一个进行排序。这是因为第一个数组中的每个元素与第二个数组上的相同索引元素有关系,我必须保持这种关系为真。例如:

sortThis=[3,1,2];
sortAccording=["With 3","With 1","With 2];

我找不到任何方法从JavaScript的sort函数中获取索引更改。

3 个答案:

答案 0 :(得分:3)

<强>解决方案: 要实现这一点,您必须只在一个压缩两个阵列。这是,给你这两个数组:

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/

祝你好运!

答案 1 :(得分:1)

例如:

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])
        }, [])
    })
}

答案 2 :(得分:0)

我有一个简单的解决方案。创建第三个索引数组。只需根据第一个数组的排序对索引数组进行排序。

  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]));