5

私は3つの配列を持っています:

  • 配列 1 は「名前」John、Jim、Jack、Jill です。

  • 配列 2 は「年齢」25、30、31、22 です。

  • 配列 3 は「性別」男性、男性、男性、女性

これらはすべて、ソート可能なヘッダー付きの表にリストされています。これで、並べ替えが正常に機能します。たとえば、「名前」列で並べ替えられます。「年齢」と「性別」の配列を並べ替えて、それらを正しく保つにはどうすればよいですか。3つすべてを同時にソートする必要があります。

_nameArray.sort(function(a, b){
    return ((a < b) ? -1 : ((a > b) ? 1 : 0));
})

それが十分に説明されていることを願っています。

いいえ、構造を変更することはできません.1つではなく3つの配列でなければならず、配列内のフィールドでソートするだけです.

4

4 に答える 4

15

複数の配列からオブジェクトを構築するのが理想的かもしれませんが。indirectionを使用して、オブジェクト作成のオーバーヘッドなしで行うこともできます。

/* An array of indexes */
var idx = [];
for (var i = 0; i < Name.length; i++) {
    idx.push(i);
}

/* A shorthand function */
var comparator = function(arr) {
    return function(a, b) {
        return ((arr[a] < arr[b]) ? -1 : ((arr[a] > arr[b]) ? 1 : 0));
    };
};

/* Sort by Age */
idx = idx.sort(comparator(Age));

/* Get the sorted order */
for (var i = 0; i < Name.length; i++) {
    console.log(Name[idx[i]], Age[idx[i]], Gender[idx[i]]);
}​

idx配列には、他の配列の要素へのインデックスが含まれていますidx[i]Nameインダイレクションを使用すると、 、AgeおよびGender;の要素にアクセスできます。つまり、Name[idx[i]]

パフォーマンスが問題になる場合は、オブジェクトの構築は、一度だけ行うと、その場での並べ替えを使用して高速になる可能性があります。それ以外の場合は、実際の配列にまったく触れずに間接参照を使用します。

ほらね。

:comparator関数は単なる例です。基準に基づいて独自のコンパレータ関数を実際に作成する必要があります。

于 2012-12-19T20:05:09.097 に答える
2

オブジェクトを作成してみましたが (いくつかのコメントで示唆されているように)、追加された複雑さがそれだけの価値があるかどうかはわかりませんが、有用な場合に備えてここに投稿します。この特定のケースでは、オブジェクトはほとんど役に立たず、より有用な可能性があるのは、結合データを格納し、並べ替え、各タイプの特性のリストを入力および出力として処理Personする集約オブジェクト ( ) です。PersonSet( jsfiddle )

var names = ['John', 'Jim', 'Jack', 'Jill'],
    ages = [25, 30, 31, 22],
    genders = ['male', 'male', 'male', 'female'];
function Person(name, age, gender) {
    this.name = name;
    this.age = age;
    this.gender = gender;
}
function PersonSet(names, ages, genders) {
    this.content = [];
    for (var i = 0; i < names.length; i++) {
        this.content.push(new Person(names[i], ages[i], genders[i]));
        // (alternatively...)
        // this.content.push({name: names[i], age: ages[i], gender: 
        //     genders[i]});
    }
    this.sort = function(aspect) {
        this.content.sort(function(a, b) {
            return ((a[aspect] < b[aspect]) ? -1 : 
                ((a[aspect] > b[aspect]) ? 1 : 0));
        });
    };                    
    this.get = function(aspect) {
        var r = [];
        for (var i = 0; i < this.content.length; i++) {
            r.push(this.content[i][aspect]);
        }
        return r;
    }
}
var personSet = new PersonSet(names, ages, genders);
personSet.sort('age');
console.log(personSet.get('name'), personSet.get('age'), 
            personSet.get('gender'));​​​​​​​​​​
于 2012-12-19T20:48:57.770 に答える
0

制約があれば、独自のソート関数を作成しないでください。sort 関数内では、次のようなすべての配列を維持します。

  1. 最下位の項目を見つけます。インデックス 5 にあるとします。ここで、3 つの配列すべてで item@index5 を item@index0 と交換します。
  2. 上記のロジックをインデックス 1 から繰り返します...
于 2012-12-19T20:04:10.700 に答える