2012-01-02 3 views
0

То, что я пытаюсь сделать, это переупорядочить многомерный массив на основе длин каждого из его массивов, от самого высокого до самого низкого.JS: Сортировка многомерного массива на основе длины каждого поддиапазона

var array0 = [9, 7, 1]  
var array1 = [2] 
var array2 = [20, 3, 8, 11] 
var array3 = [0, 6]; 

var multi = [array0, array1, array2, array3]; 

var multiLengths = []; 

$(multi).each(function(i) { // for loop using jQuery 
    multiLengths.push(this.length); 
}); 
// multiLengths: 3,1,4,2 

function sortDesc(a,b) { //sort in descending order 
    return b - a; 
} 

multiLengths.sort(sortDesc); 

// somehow re-order multi to be: [array2, array0, array3, array1] 

Так как я бы изменить порядок «несколько» массив, основанный на новом отсортированном порядке «multiLengths»? Это сложно, потому что новый порядок создается с помощью функции сортировки, поэтому я не могу индексировать результаты массива sortedMulti.

+0

Я не понимаю, почему вам нужно jQuery для циклического прохождения обычного массива. Даже если вы используете jQuery, правильным способом для этого массива будет '$ .each (multilengths, fn)'. –

+0

возможно, потому что я не такой уж большой javascript, но я знаю, что так, как я это делал, это правильно работает или нет. PS собственно, какие стандарты? – inorganik

+0

Мне не нужно ссылаться на какой-либо стандарт для этого. Посмотрите на циклы JavaScripts 'for', они быстрее, чем jQuerys' .each', и просто и излишне, чтобы импортировать библиотеку 30 Кбайт для перебора массивов. –

ответ

3

Вы можете просто использовать сортировку по multi непосредственно:

multi.sort(function (a, b) { 
    return b.length - a.length; 
}); 
1
$(multi).each(function(i) { // for loop using jQuery 
    multiLengths.push([this.length, this]); 
}); 

function sortDesc(a,b) { //sort in descending order 
    return b[0] - a[0]; 
} 

, а затем, когда вы закончите сортировку multiLengths, просто отобразить результат на элемент [1].

Это не так полезно в этом контексте, вероятно (@ Ответ FelixLoether намного проще), но в случае, если вам нужен более сложный расчет, чем .length, этот способ кэширования и сортировки довольно эффективен.

+0

Я смущен тем, что [0] добавлен в b-a ... Любой способ объяснить это мне? – inorganik

+0

Вместо того, чтобы создавать только массив длин, я сделал массив длин * вместе с исходными элементами *. Затем вы сортируете их по длинам (которые хранятся в первом элементе (i.e '[0]')). Оригинальный элемент теги вдоль и заканчивается в его отсортированном положении. Затем вы просто извлекаете сам элемент ('[1]') и отбрасываете кешированную длину. – Amadan

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