Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 创建由每个子数组的最大值组成的数组无法按预期工作_Javascript_Arrays_Algorithm - Fatal编程技术网

Javascript 创建由每个子数组的最大值组成的数组无法按预期工作

Javascript 创建由每个子数组的最大值组成的数组无法按预期工作,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,在每个子数组中找到最大的数字,然后将这些最大的数字组成一个数组。[[4,5,1,3],[13,27,18,26],[32,35,37,39],[10001001857,1] 我写了一些代码,但我不知道它出了什么问题。可能是Array.push()方法不起作用,或者可能是for循环 function largestOfFour(arr) { var main = []; for(k=0;k<arr.length;k++){ var long= 0;

在每个子数组中找到最大的数字,然后将这些最大的数字组成一个数组。
[[4,5,1,3],[13,27,18,26],[32,35,37,39],[10001001857,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]], "");
函数最大四(arr){
var main=[];

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

如@edc65所述,
long
的声明应出现在函数的开头,以明确
long
作为所有局部变量都有一个函数范围


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


在if语句中,赋值是颠倒的。它应该是

long = arr[k][i];
并且条件也是相反的。
long
存储每个子数组的最大值。因此,如果您发现一个值大于它,则更新它:

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

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

main.push(long);
括号用于调用方法。括号用于访问对象中的属性

最终代码
根据和答案,这可以进一步简化为呼叫。

实现相同结果的可能更简单的方法-简单是可靠性的先决条件

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's 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(见注释…


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

原文是,我只是在这里解释一下

不需要嵌套循环,您可以在单行中实现这一点

var arr=[[4,5,1,3],[13,27,18,26],[32,35,37,39],[10001001857,1];
var result=arr.map(Math.max.apply.bind(Math.max,null));
记录(结果);

console.log(result);
我已经看完了代码,并以其他解决方案结束。第一个for循环遍历大数组,第二个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(long<arr[k][i]) {
              long=arr[k][i];
          }
       }
   main.push(long);
   }
  return main;
}
函数最大四(arr){
var main=[];

对于(k=0;kyou需要为每个k循环重置
long
…即将var long=0移动到for k循环的顶部请不要更正问题中的代码。我将使用
long=arr[k][0]
而不是重置时的
long=0
。这将处理数字全部为负数的情况。在for中使用var long…也是一个(小)问题。所有局部变量都在函数范围内,应该在顶部声明。相反,似乎long在for()的内部范围内,这不是。您应该使用
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's 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];
    });
}
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's return
    return arr.map(function(subarr){
        // sort to get highest value at front, and then return it
        return Math.max.apply(null, subarr);
    });
}
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;
}