2013-06-24 2 views
2

У меня есть что-то вроде этого массиваМассив массива - Javascript

a=[ 
[1,6,6,8,0], 

[7,3,2,6], 


[7,3,2] 

] 

Здесь, мне нужно, чтобы найти максимальную длину внутри массива. И мне нужно заменить другое на «0».

Например, первый массив имеет 5 элементов, что является максимальной длиной, поэтому мне нужно поставить '0' во 2-й и 3-й массивы, пока не достигнет максимального значения (т. Е. 5). Что мне здесь делать?

+0

Вы должны быть в состоянии найти длину самого длинного массива, расширив тип массива. См. Http://stackoverflow.com/questions/1669190/javascript-min-max-array-values. –

ответ

6
var max = Math.max.apply(null, a.map(function(i) { 
    return i.length; 
})); 
var new_arr = a.map(function(i) { 
    var pad = max - i.length; 
    while (pad--) { 
     i.push(0); 
    } 
    return i; 
}); 

http://jsfiddle.net/Mgfnf/1/

+1

Примечание: 'Array # map' нуждается в полиполнении для IE –

+0

Любые причины использования' while (len -) 'вместо классического цикла' for'? На самом деле это не быстрее. –

+0

@Jan Dvorak: для 'for' нам понадобится иметь другую переменную (потому что никто не будет использовать' i.length' в условии завершения цикла 'for'). Так что это просто - личный выбор, который, я думаю, немного читаем. – zerkms

0

попробовать это

var i = 0, 
    max = 0; 

while(i<a.length){ // find max 
    max = a[i].length > max ? a[i].length : max; 
    i++; 
} 

i = 0; 
while(i<a.length){ 

    for(var j=a[i].length;j<max;j++){ 
     a[i][j] = 0; 
    } 
    i++; 
} 
+0

Это не сразу ясно, почему это было уменьшено - будь то для читаемости или недостатка в процедуре, которая делает ее неправильной. В любом случае, я нахожу решение zerkms более читабельным и выразительным. –

+0

Это немного примитивно, я знаю. но это простое решение, которое работает правильно. – AntouanK

+0

Ваш метод заполнения неэффективен. –

3

Как вы сказали, ваша задача разделяется на две части:

  1. Найти максимальную длину массива
  2. Pad массивы в соответствуют этой длине

Оба # 1 и # 2 могут быть достигнуты посредством простой петли через внешний массив. Во-первых, мы сохраняем переменную (назовем ее maxLength), которая будет содержать, да, нашу максимальную длину.

var maxLength = 0; 
//walk through the array 
for (var i = 0; i < a.length; i += 1) { 
    //choose the larger 
    maxLength = Math.max(maxLength, a[i].length); 
} 

Теперь, когда мы имеем размер мы хотим расширяться, мы идем по внешней петле, и на каждой подрешетки, мы push 0s до длин матча:

//walk through the array 
for (var j = 0; j < a.length; j += 1) { 
    //the length will increase by 1 on each push 
    while (a[j].length < maxLength) { 
     a[j].push(0); 
    } 
} 

И это Это.

+2

Downvoter, не могли бы вы объяснить? Я где-то ошиблась? – Zirak

+1

Я не вижу причины для нисходящего потока. На самом деле, я думаю, этот ответ может быть наиболее полезным для ОП. OP должен сначала убедиться, что он знает, как решить эту проблему с помощью простого кода, даже не изучая причудливые решения, используя 'apply'. –