1

2つのアレイがあります。一方(降順または昇順)で通常の並べ替えを実行し、最初の配列の並べ替え方法に従ってもう一方を並べ替える必要があります。これは、最初の配列の各要素が2番目の配列の同じインデックス要素と関係を持っているためです。この関係を真に保つ必要があります。例えば:

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

sortJavaScriptの関数からインデックスの変更を取得する方法が見つかりませんでした。

4

3 に答える 3

3

解決策: これを実現するには、両方のアレイを1つに圧縮する必要があります。これは、次の2つの配列がある場合です。

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"}];

次に、次のように並べ替えます

zippedAndSorted = [{a: 1, b: "With 1"}, {a: 2, b: "With 2"}, {a: 3, b: "With 3"}];

次は何?

この配列を必要な順序で並べ替えたら、map関数を使用して値を抽出する必要があります。最終的に、2つの配列を同じ基準で並べ替えることができます。

コード:

// 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/

幸運を!

于 2012-12-22T16:40:53.670 に答える
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])
        }, [])
    })
}
于 2012-12-22T16:06:03.927 に答える
0

これには簡単な解決策があります。インデックスの3番目の配列を作成します。最初の配列の並べ替えに基づいて、そのインデックス配列を並べ替えるだけです。

  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]));
于 2012-12-22T16:11:06.413 に答える