簡體   English   中英

一次排序多個數組

[英]Sorting multiple arrays at once

我有3個數組:

  • 陣列1是“名字”約翰,吉姆,傑克,吉爾

  • 陣列2是“年齡”25,30,31,22

  • 陣列3是“性別”男性,男性,男性,女性

我把這些都列在一個帶有可排序標題的表中。 現在排序工作正常,它按“名稱”列進行排序。 我怎樣才能對“年齡”和“性別”數組進行排序以保持正確。 我需要同時對所有3個進行排序。

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

希望它解釋得很好。

沒有結構不能改變,它的方式必須是3個數組,而不是一個,只是按數組中的字段排序。

即使從多個陣列構造對象可能是理想的。 您也可以在沒有使用間接的對象創建開銷的情況下執行此操作。

/* 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] 通過使用間接,您可以訪問NameAgeGender的元素; 即, Name[idx[i]]

如果性能是一個問題,那么使用就地排序可以更快地構建對象,如果你只做一次。 否則,我會使用間接而不會觸及真正的數組。

你去吧

注意comparator功能只是一個示例,您需要根據您的標准實際創建自己的比較器功能。

嘗試制作對象(正如一些評論中所建議的)我不確定增加的復雜性是否值得,但無論如何它都會在這里發布,以防它有用。 在這種特殊情況下, 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'));​​​​​​​​​​

如果您想要對表中的數據進行排序,您應該查看Tablesorter

鑒於您的約束,為什么不編寫自己的排序函數。 在sort函數中維護所有數組,如:

  1. 找到最低的項目。 假設它在索引5處。現在在所有3個數組中將item @ index5與item @ index0交換。
  2. 從索引1開始重復上述邏輯...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM