2010-05-08 3 views
7

У меня есть массив с массивами в нем, где я хочу сортировать внешние массивы на основе значений в определенном столбце во внутреннем.сортировать внешний массив на основе значений во внутреннем массиве, javascript

Держу пари, что это звучало более чем путано, поэтому я перейду прямо к примеру.

Исходные данные:

var data = [ 
    [ 
    "row_1-col1", 
    "2-row_1-col2", 
    "c-row_1-coln" 
    ], 
    [ 
    "row_2-col1", 
    "1-row_2-col2", 
    "b-row_2-coln" 
    ], 
    [ 
    "row_m-col1", 
    "3-row_m-col2", 
    "a-row_m-coln" 
    ] 
]; 

Сортировка данных, основываясь на колонке с индексом 1

data.sortFuncOfSomeKind(1); 

где объект затем будет выглядеть следующим образом;

var data = [ 
    [ 
    "row_2-col1", 
    "1-row_2-col2", 
    "b-row_2-coln" 
    ], 
    [ 
    "row_1-col1", 
    "2-row_1-col2", 
    "c-row_1-coln" 
    ], 
    [ 
    "row_m-col1", 
    "3-row_m-col2", 
    "a-row_m-coln" 
    ] 
]; 

Сортировка данных, основанные на колонке с индексом 2

data.sortFuncOfSomeKind(2); 

где объект затем будет выглядеть следующим образом;

var data = [ 
    [ 
    "row_m-col1", 
    "3-row_m-col2", 
    "a-row_m-coln" 
    ], 
    [ 
    "row_2-col1", 
    "1-row_2-col2", 
    "b-row_2-coln" 
    ], 
    [ 
    "row_1-col1", 
    "2-row_1-col2", 
    "c-row_1-coln" 
    ] 
]; 

Большой Q

Есть существующее решение для этого, что вы знаете, или я должен написать один я? Если да, то какой будет самый простой алгоритм сортировки? QuickSort?

_L

+2

возможно дубликат [сортировка объектов в массиве по значению поля в JavaScript] (http://stackoverflow.com/questions/1129216/sorting-objects-in-an-array- по-а-полевой значение- in-javascript), [Javascript: как отсортировать массив записей по значениям в одном из полей?] (http://stackoverflow.com/questions/1689679/javascript-how-to-sort-an-array-of -records-by-values-in-one-of-the-fields) – outis

ответ

8

Array#sort (см. Раздел 15.4.4.11 из the spec, или MDC) принимает необязательный параметр функции, который будет использоваться для сравнения двух записей для целей сортировки. Функция должна возвращать -1, если первый аргумент «меньше» второго, 0, если они равны, или 1, если первый «больше» второго. Итак:

outerArray.sort(function(a, b) { 
    var valueA, valueB; 

    valueA = a[1]; // Where 1 is your index, from your example 
    valueB = b[1]; 
    if (valueA < valueB) { 
     return -1; 
    } 
    else if (valueA > valueB) { 
     return 1; 
    } 
    return 0; 
}); 

(Вы можете очевидно сжать, что код немного, я держал его многословным для ясности.)

1

Здесь раньше реализацию сортировки, возвращаемый результат простого x<y сравнения. Это решение разочаровывается, и этот пост остается только для сохранения последующего обсуждения.

+0

D'oh. Я не знал, что вы можете просто вернуть x [a]> y [a] для сравнительного значения. Это спасет меня несколькими строками кода. – awgy

+0

@David: Вы возвращаете 'true' или' false'. Вам нужно вернуть -1, 0 или 1. (Я проверил, в случае, если у вас было какое-то действительно здоровое состояние, но это не удалось правильно сортировать во всех случаях.) –

+0

@awgy: Вы не можете: Http: // Pastie.org/951302 –

4

Вот решение не нуждаясь в отдельную переменную, чтобы содержать индексировать

var arr = [.....] 
arr.sort((function(index){ 
    return function(a, b){ 
     return (a[index] === b[index] ? 0 : (a[index] < b[index] ? -1 : 1)); 
    }; 
})(2)); // 2 is the index 

Это сортирует по индексу 2

+1

Вы должны изменить это '=' на '==='. Сравнения не любят ошибочно принимать за задания. – awgy

+0

Ну, измените его на '==' или '===' в зависимости от ваших потребностей. –

+0

yep, небольшая ошибка там - исправлено сейчас –

Смежные вопросы