创建由每个子数组的最大值组成的数组不能按预期工作

Lav*_*ios 11 javascript arrays algorithm

找到每个子数组中的最大数字,然后创建这些最大数字的数组.[[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]], "");
Run Code Online (Sandbox Code Playgroud)

Fer*_*oto 14

当您尝试查找每个数组的最大值时,问题出在内部循环上.在外循环的每次迭代中,您应该重置long = arr[k][0].它不应该重置为0,因为最大值可能小于0.请注意,这要求所有子数组至少有一个项目.

正如@ edc65所指出的,声明long应该在函数的开头发生,以明确表示long,因为所有局部变量都具有函数作用域.


每个子阵列只需要一个值.因此,您应该为外部循环的每次迭代添加一个值(main.push应该在外部循环中).目前的方式是,每个子数组元素添加一个值.


在if语句中,您的分配被反转.它应该是

long = arr[k][i];
Run Code Online (Sandbox Code Playgroud)

而且情况也是倒置的.long存储每个子阵列的最大值.因此,如果找到大于它的值,则更新它:

if(arr[k][i]>long) {
    long = arr[k][i];
}
Run Code Online (Sandbox Code Playgroud)

当推入数组时使用括号,而不是括号:

main.push(long);
Run Code Online (Sandbox Code Playgroud)

括号用于调用方法.括号用于访问对象中的属性.

最终代码

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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

@ BillyMoon的@图莎尔的答案,这可以进一步简化为一个Array.map呼叫.


Tus*_*har 6

我知道这里的问题是在现有代码中找到一个错误,以防您想要优化代码

最初的想法@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);
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

array.map函数迭代调用它的数组中的每个元素.传递给maphere 的函数是apply将其this上下文绑定到绑定的Math.max第一个参数null.

Math.max.apply.bind(Math.max, null)这基本上将Math.max数组上的函数调用为

Math.max.apply(null, array);
Run Code Online (Sandbox Code Playgroud)

更新:

使用ES6,箭头功能扩展操作符,可以使其更小

arr.map(e => Math.max(...e))
Run Code Online (Sandbox Code Playgroud)

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

var result = arr.map(e => Math.max(...e));

document.write(result);
console.log(result);
Run Code Online (Sandbox Code Playgroud)