2015-09-04 3 views
0

Я новичок в javascript, и я не знаю, как итерации массива массивов в javascript.Итерация массива массивов в javascript

У меня есть проблема, где я должен найти большой массив из массива входного массива:

Вернуть массив, состоящий из наибольшего числа от каждого при условии вложенного массива. Для простоты предоставленный массив будет содержать точно 4 подматрицы. Помните, что вы можете перебирать массив с простым для цикла, и получить доступ к каждому члену синтаксиса массива обр [I]

Первая проблема решается мной успешно, код которого я написал в конце, но я не в состоянии решить второй вход.

Проблема 1 [решаемые]

  • Входной сигнал: largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39],[1000,1001, 857, 1]]);

  • Выход: [1000,1001,857,1]

Проблема 2 [НЕ РЕШИТЬ]

  • Вход: largestOfFour( [[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]), [27,5,39,1001]);

  • Выход: [27,5,39,1001]

Если до сих пор не ясно смотреть эту ссылку и скажите мне вот это

http://freecodecamp.com/challenges/bonfire-return-largest-numbers-in-arrays

Мой код е или первой проблемой. (Alter моего кода так, что второе может быть решено)

function largestOfFour(arr) { 
    var iAmLarge = new Array(); 
    iAmLarge = arr[0]; 
    var large = iAmLarge[0]; 

    for(var i=0;i<iAmLarge.length;i++) { 
    if(large<=iAmLarge[i]) { 
     large = iAmLarge[i]; 
    }  
    } 
    var maxFoundAt = 0; 
    for(var i=0;i<arr.length;i++){ 
    var newArray=new Array(); 
    newArray = arr[i]; 
    var max = newArray[0]; 
    for(var j=0;j<newArray.length;j++) { 
     if(max<newArray[j]) { 
     max = newArray[j]; 
    }  
    } 
if(max>=large) {   
     large = max; 
     maxFoundAt = i;  
    } 
    } 
alert(arr[maxFoundAt]); 
} 

largestOfFour([[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]]); 
+0

Это те проблемы, домашнее задание или что-то подобное? – EnriMR

+2

@ EnriMR Не имеет значения, поскольку OP показал правильное усилие в решении этого вопроса самостоятельно. – axelduch

+1

Определите «Самый большой массив». (Наибольшее число/Самая высокая сумма/и т. Д.) – Jamiec

ответ

2

Вы заявили (в комментариях, и от указанной ссылки) задач, установленных в

Вернуть массив, состоящий из наибольшего числа из каждый из которых имеет подматрицу. Для простоты предоставленный массив будет содержать ровно 4 поддиапазона. Помните, что вы можете перебирать массив с простым циклом, и получить доступ к каждому члену синтаксиса массива обры [I]

Это означает, что то, что вам нужно сделать, это повторять каждый массив и найти наибольшее число из каждый массив и возвращает массив, содержащий наибольшее число из каждого вспомогательного массива.Поэтому ввод:

[[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39],[1000,1001, 857, 1]] 

должно дать ответ

[5,27,39,1001] 

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

Начните с простым 1-мерным массивом

[4, 5, 1, 3] 

И написать функцию, чтобы найти наибольшее число из этого массива.

function getLargestFromArray(arr){ 
    // You can do this bit! 
    // Its easy, just store zero in a variable, and iterate the array 
    // if the current value is greater than the stored number 
    // set the stored number to this value 
    // when youve iterated all values return the currently stored highest number 
} 

Теперь вы знаете, что ваш оригинальный вход будет массив из 4-х массивов (так сказал присваивание!), Так что вы можете использовать номер 4 для прохода на вход

var output = new Array(); 
for(var i=0;i<4;i++){ 
    var thisArr = input[i]; 
    var highest = getLargestFromArray(thisArr) 
    output[i] = highest; // or output.push(highest); 
} 

Это так просто!

+0

То, о чем вы говорите, является i уже сделали, но что это за вещь наибольшаяOfFour ([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1 ]]), [27,5,39,1001]); Существует массив массивов, но как получить доступ к этому [27,5,39,1001], я больше не могу получить к нему доступ –

+0

@HarshSharma '[27,5,39,1001]' в этом примере - это * ожидаемый результат *! Его не другой массив во вводе - назначение говорит, что в массиве всегда будут содержаться * 4 поддиапазона *. Вы запутались. – Jamiec

+0

Вы проверили связь и решили ее –

3

Для второй задачи, где вы хотите, чтобы собрать наибольшее количество из каждого суб-массива, вы можете сделать это (рабочий фрагмент):

function largestOfFour(master) { 
 
    var result = []; 
 
    // iterate through all arrays passed 
 
    for (var i = 0; i < master.length; i++) { 
 
     // master[i] is an array and can be just treated like any array 
 
     result.push(Math.max.apply(Math, master[i])); 
 
    } 
 
    return result; 
 
} 
 

 
var r = largestOfFour( [[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]); 
 

 
// show result in snippet 
 
document.write(JSON.stringify(r));


Чтобы объяснить бит, Math.max.apply(Math, array) - это трюк для нахождения наибольшего значения в массиве. Он работает следующим образом:

Math.max() принимает столько аргументов, сколько вы хотите передать. Например, вы можете сделать Math.max(1,2,3,4,5,6) и он вернет 6. Итак, если вы можете передать ему целый массив аргументов, тогда он найдет максимальное значение во всем массиве.

Итак, как вы превращаете массив значений в набор аргументов функции. Ну, вы можете использовать .apply() для этого. Это метод для любой функции в Javascript. Вы можете прочитать о here on MDN. Итак, поскольку Math.max() является функцией, мы можем использовать Math.max.apply() для использования массива значений в качестве аргументов для Math.max(). .apply() принимает два аргумента. Первый - значение this, которое вы хотите, чтобы функция имела. Это, оказывается, не очень актуально здесь, поэтому мы передаем Math, который просто дает функцию .max() то же самое значение this, которое было бы, если бы мы назвали его Math.max(). Второй аргумент .apply() - это массив значений, которые мы хотим быть аргументами для нашей функции. Для этого мы просто передаем наш массив. Итак, мы закончили с:

Math.max.apply(Math, myArray); 

, чтобы найти наибольшее значение в myArray.Чтобы увидеть, как это работает, давайте предположим, что мы имеем:

var myArray = [9,8,7,1]; 
var highest = Math.max.apply(Math, myArray); 

То есть так же, как это:

var highest = Math.max(9,8,7,1); 

Math.max.apply(Math, myArray) принимает массив значений в myArray и передает их как последовательные аргументы Math.max() так же, как если бы мы ввели их в наш код вручную в качестве аргументов.

И, в обоих случаях выше, highest === 9.

+0

@Jamiec. Это может быть проблемой для OP (они будут должны решить, что использовать), но я не собираюсь преподавать неэффективный способ сделать это. Я показываю хороший способ решить проблему. 'Math.max.apply()' - хорошо известный трюк для нахождения наибольшего значения в массиве, потому что 'Math.max() 'принимает столько аргументов, сколько вы хотите передать, и он найдет максимальное значение для всех из них, поэтому вы можете передать ему весь массив, используя' .apply() '. – jfriend00

+0

Я, как правило, согласен, но есть уже много мест, чтобы узнать этот трюк. Я как бы вижу аналогию, что студент физики средней школы спросил об атомах, и вы вникали в квантовую механику;) – Jamiec

+0

@Jamiec - по-другому. Наша задача - научить хорошим способам решения проблемы. Задача ОП - понять, чему мы учим, и решить, что использовать для их домашней работы. – jfriend00

1
var a = [[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]; 
var temp = []; 
for (var i = 0; i < a.length; i++) { 
    temp.push(a[i].sort(function(a, b){return b - a;})[0]); 
} 
console.log(temp); 
1

Это будет работать для любого числа подрешеток, поэтому я хотел бы изменить название maxOfSubArrays или что-то подобное. Он похож на решение @Jamiec, но использует функцию карты для применения функции max к каждому вспомогательному массиву, вам не нужно циклически перебирать основной массив.

function largestOfFour(arrayOfArrays) { 
    return arrayOfArrays.map(function (singleArray) { 
     return Math.max.apply(null, singleArray); 
    }); 
} 

http://jsfiddle.net/bLn3k14n/

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