Подтвердить что ты не робот

Создание массива, состоящего из самых больших значений каждого подматрица, не работает должным образом

Найдите наибольшее число в каждом из подматриц и затем создайте массив из этих наибольших чисел. [[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]

Я написал код, и я не могу понять, что с ним не так. Возможно, метод Array.push() не работает или, возможно, цикл for.

function largestOfFour(arr) {
    var main = [];
    for(k=0;k<arr.length;k++){
       var long= 0;
         for(i=0;i<arr[k].length;i++){
            if(arr[k][i]<long) {
                arr[k][i] = long;
            }
            main.push[long];
        }
    }
    return main
}

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

Ответ 1

Проблема заключается во внутреннем цикле, когда вы пытаетесь найти максимальное значение для каждого массива. На каждой итерации внешнего контура вы должны reset long = arr[k][0]. Это не должно быть reset до 0, так как максимальное значение может быть меньше 0. Обратите внимание, что это ожидает, что все подмассивы будут иметь хотя бы один элемент.

Как отмечено в @edc65, объявление в начале long должно появиться в начале функции, чтобы было ясно, что long, поскольку все локальные переменные имеют область действия.


Вам нужно только одно значение для каждого подмассива. Поэтому вы должны добавить одно значение для каждой итерации внешнего цикла (main.push должно быть во внешнем цикле). Таким образом, в настоящее время вы добавляете одно значение для каждого элемента subarray.


В инструкции if ваше задание инвертируется. Это должно быть

long = arr[k][i];

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

if(arr[k][i]>long) {
    long = arr[k][i];
}

При нажатии в массив используйте скобки, а не скобки:

main.push(long);

Скобки для вызова методов. Кронштейны предназначены для доступа к свойствам объекта.

Конечный код

function largestOfFour(arr) {
    var main = [];
    var long;
    for(k=0;k<arr.length;k++){
       long = arr[k][0];
         for(i=0;i<arr[k].length;i++){
            if(arr[k][i]>long) {
                long = arr[k][i];
            }
        }
        main.push(long);
    }
    return main;
}

Math.max метод

Вы можете использовать Math.max для упрощения кода

function largestOfFour(arr) {
    var main = [];
    for(k=0;k<arr.length;k++){
        var long = Math.max.apply(null, arr[k]);
        main.push(long);
    }
    return main;
}

В соответствии с ответами @BillyMoon и @Tushar's это может быть дополнительно упрощено до Array.map.

Ответ 2

Я знаю, что вопрос заключается в том, чтобы найти ошибку в существующем коде, в случае если вы захотите оптимизировать код

Оригинальная идея относится к @thefourtheye. Я просто объясняю это здесь.

Нет необходимости вложенных циклов, вы можете достичь этого в одной строке.

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

var result = arr.map(Math.max.apply.bind(Math.max, null));

document.write(result);
console.log(result);

Ответ 3

Потенциально более простой способ достижения такого же результата - простота является предпосылкой для надежности...

function largestOfFour(arr){
    // assumes compatible browser, or shim: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Browser_compatibility
    // map array each element into new value based on callback return
    return arr.map(function(subarr){
        // sort to get highest value at front, and then return it
        return subarr.sort(function(a,b){
            return b-a;
        })[0];
    });
}

или с Math.max(см. комментарии...)

function largestOfFour(arr){
    // assumes compatible browser, or shim: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Browser_compatibility
    // map array each element into new value based on callback return
    return arr.map(function(subarr){
        // sort to get highest value at front, and then return it
        return Math.max.apply(null, subarr);
    });
}

Ответ 4

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

function largestOfFour(arr) {
  var main = [];
  for(k=0;k<arr.length;k++){
     var long=0;
       for(i=0;i<arr[k].length;i++){
          if(long<arr[k][i]) {
              long=arr[k][i];
          }
       }
   main.push(long);
   }
  return main;
}