61

たとえば、これらの配列がある場合:

var name = ["Bob","Tom","Larry"];
var age =  ["10", "20", "30"];

そしてname.sort()、「名前」配列の順序を次のように使用します。

var name = ["Bob","Larry","Tom"];

しかし、どうすれば「name」配列をソートし、「age」配列を同じ順序に保つことができますか? このような:

var name = ["Bob","Larry","Tom"];
var age =  ["10", "30", "20"];
4

12 に答える 12

79

既存の配列を並べ替えたり、データを再編成したりできます。

方法 1: 既存の配列を使用するには、それらを結合、並べ替え、および分離することができます: (配列の長さが等しいと仮定)

var names = ["Bob","Tom","Larry"];
var ages =  ["10", "20", "30"];

//1) combine the arrays:
var list = [];
for (var j = 0; j < names.length; j++) 
    list.push({'name': names[j], 'age': ages[j]});

//2) sort:
list.sort(function(a, b) {
    return ((a.name < b.name) ? -1 : ((a.name == b.name) ? 0 : 1));
    //Sort could be modified to, for example, sort on the age 
    // if the name is the same.
});

//3) separate them back out:
for (var k = 0; k < list.length; k++) {
    names[k] = list[k].name;
    ages[k] = list[k].age;
}

これには、文字列解析手法に依存しないという利点があり、一緒に並べ替える必要がある任意の数の配列で使用できます。

方法 2:または、データを少し再編成して、オブジェクトのコレクションを並べ替えることができます。

var list = [
    {name: "Bob", age: 10}, 
    {name: "Tom", age: 20},
    {name: "Larry", age: 30}
    ];

list.sort(function(a, b) {
    return ((a.name < b.name) ? -1 : ((a.name == b.name) ? 0 : 1));
});

for (var i = 0; i<list.length; i++) {
    alert(list[i].name + ", " + list[i].age);
}
​

比較では、-1 はインデックスが低いことを意味し、0 は等しいことを意味し、1 はインデックスが高いことを意味します。sort()そして、基になる配列を実際に変更することは注目に値します。

また、注目に値するのは、並べ替えに加えてリスト全体を 2 回ループする必要がないため、方法 2 の方が効率的であることです。

http://jsfiddle.net/ghBn7/38/

于 2012-07-16T06:52:58.583 に答える
2

jwatts1980's answer (Update 2)とよく似ています。マップによる並べ替えを読むことを検討してください。

name.map(function (v, i) {
    return {
        value1  : v,
        value2  : age[i]
    };
}).sort(function (a, b) {
    return ((a.value1 < b.value1) ? -1 : ((a.value1 == b.value1) ? 0 : 1));
}).forEach(function (v, i) {
    name[i] = v.value1;
    age[i] = v.value2;
});
于 2015-06-20T11:33:22.860 に答える
1

@ jwatts1980 の回答と@Alexander の回答 (ここ)からインスピレーションを得て、両方の回答を迅速で汚いソリューションにマージしました。メインの配列はソートされるもので、残りはそのインデックスに従うだけです

:非常に大きな配列ではあまり効率的ではありません

 /* @sort argument is the array that has the values to sort
   @followers argument is an array of arrays which are all same length of 'sort'
   all will be sorted accordingly
   example:

   sortMutipleArrays(
         [0, 6, 7, 8, 3, 4, 9], 
         [ ["zr", "sx", "sv", "et", "th", "fr", "nn"], 
           ["zero", "six", "seven", "eight", "three", "four", "nine"] 
         ]
   );

  // Will return

  {  
     sorted: [0, 3, 4, 6, 7, 8, 9], 
     followed: [
      ["zr", th, "fr", "sx", "sv", "et", "nn"], 
      ["zero", "three", "four", "six", "seven", "eight", "nine"]
     ]
   }
 */

おそらくメソッドの署名/戻り構造を変更したいでしょうが、それは簡単なはずです。必要だったのでこのようにしました

var sortMultipleArrays = function (sort, followers) {
  var index = this.getSortedIndex(sort)
    , followed = [];
  followers.unshift(sort);
  followers.forEach(function(arr){
    var _arr = [];
    for(var i = 0; i < arr.length; i++)
      _arr[i] = arr[index[i]];
    followed.push(_arr);
  });
  var result =  {sorted: followed[0]};
  followed.shift();
  result.followed = followed;
  return result;
};

var getSortedIndex = function (arr) {
  var index = [];
  for (var i = 0; i < arr.length; i++) {
    index.push(i);
  }
  index = index.sort((function(arr){
  /* this will sort ints in descending order, change it based on your needs */
    return function (a, b) {return ((arr[a] > arr[b]) ? -1 : ((arr[a] < arr[b]) ? 1 : 0));
    };
  })(arr));
  return index;
};
于 2013-06-14T17:12:30.077 に答える
1

2 つの独立した配列を、そのうちの 1 つでのみ sort() を呼び出してソートしようとしています。

これを実現する 1 つの方法は、これを処理する独自の並べ替えメソッドを作成することです。つまり、「元の」配列の 2 つの要素をその場で交換する場合、「属性」配列の 2 つの要素をその場で交換する必要があります。

これを試す方法の疑似コードを次に示します。

function mySort(originals, attributes) {
    // Start of your sorting code here
        swap(originals, i, j);
        swap(attributes, i, j);
    // Rest of your sorting code here
}
于 2012-07-16T06:49:17.197 に答える
0

各メンバーの元のインデックスを値に追加し、配列を並べ替えてから、インデックスを削除し、それを使用して他の配列を並べ替えることができます。コンテンツが文字列であるか、文字列との間で正常に変換できる場合にのみ機能します。

別の解決策は、元の配列のコピーを保持し、並べ替え後に各メンバーが現在どこにあるかを見つけて、他の配列を適切に調整することです。

于 2012-07-16T07:10:33.337 に答える
0

私は同じ問題を抱えていて、この信じられないほど簡単な解決策を思いつきました. 最初に、関連する要素を別の配列の文字列に結合してから、次のように並べ替え比較関数で parseInt を使用します。

<html>
<body>
<div id="outPut"></div>
<script>
var theNums = [13,12,14];
var theStrs = ["a","b","c"];
var theCombine = [];

for (var x in theNums)
{
    theCombine[x] = theNums[x] + "," + theStrs;
}

var theSorted = theAr.sort(function(a,b)
{
    var c = parseInt(a,10);
    var d = parseInt(b,10);
    return c-d;
});
document.getElementById("outPut").innerHTML = theS;
</script>
</body>
</html>
于 2016-02-07T15:45:21.733 に答える
-1

最も単純な説明が最適です。配列をマージし、並べ替え後に抽出します。配列を作成します

name_age=["bob@10","Tom@20","Larry@30"];

前と同じように配列を並べ替えてから、名前と年齢を抽出します。@ を使用して、名前の終わりと年齢の始まりを再確認できます。純粋主義者向けの方法ではないかもしれませんが、私は同じ問題を抱えており、これが私のアプローチです。

于 2014-12-06T23:42:30.870 に答える