Math.max在变量上返回null?

时间:2017-06-26 00:33:31

标签: javascript arrays math

所以我正在构建一段JavaScript代码,它返回每个提供的子数组中最大数字的数组。

function largestOfFour(arr) {
var array = [];
for (i = 0; i < arr.length; i++) {
// return arr[i].join() on this line gives 4,5,1,3
array.push(Math.max(arr[i].join()));
}
return array;
}

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

我的问题是为什么Math.max(arr [i] .join())返回一个空值? 如果我在前一行返回arr [i] .join()(如在代码注释中),则返回第一次迭代的4,5,1,3。如果我输入Math.max(4,5,1,3),则返回5,这就是我想要的。

将arr [i] .join()分配给变量然后放入Math.max也会返回null。我会通过reduce函数运行Math.max,但它不会让我通过循环运行函数。

我确信有一个简单的原因,为什么这不起作用,但我无法在任何地方找到解释。我不需要帮助解决整体问题,只需帮助理解为什么Math.max不起作用。

5 个答案:

答案 0 :(得分:6)

Math.max(4,5,1,3)Math.max('4,5,1,3')是两种非常不同的操作。传递包含逗号分隔值的字符串 与传递多个参数相同:

function foo(x, y, z) {
   console.log('x', x);
   console.log('y', y);
   console.log('z', z);
}

foo(1,2,3);
foo('1,2,3');
foo([1,2,3].join());

Math.max期望传递多个数字,而不是一个字符串

你应该问的问题是:

How can I pass the elements of an array as arguments to a function?

答案 1 :(得分:2)

你想使用带有math max的数组,问题是max想要一个参数列表。所以我们使用apply来做到这一点

var arr = [1,4,5,9]
var max = Math.max.apply( Math, arr );
console.log(max);

使用地图,你可以得到所有最大的数字

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

var result = nums.map(arr =>  Math.max.apply(Math, arr))
//var result = nums.map(function(arr){ return Math.max.apply(Math, arr)})
console.log(result)

答案 2 :(得分:1)

正如文件中所写,并在评论中提到:

  

join()方法将数组(或类数组对象)的所有元素连接成一个字符串。

因此,请删除join并重写max,如下所示:

function largestOfFour(arr) {
    var array = [];
    for (i = 0; i < arr.length; i++) {
        array.push(Math.max(...arr[i]));
    }
    return array;
}

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

答案 3 :(得分:0)

function largest(arr) {
  var array = [];

  for (var i = 0; i < arr.length; i++) {
    array.push(Math.max.apply(null, arr[i]));
  }

  return array;
}

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

var result = largest(array);
console.log(result);

答案 4 :(得分:0)

来自Math.max

的返回值的MDN docs
  

给定数字中最大的一个。如果至少有一个参数无法转换为数字,则返回NaN。

如果您实际观察到函数中的array变量,则会在循环结束时看到[NaN, NaN, NaN, NaN]。这表明至少有一个参数无法转换为数字。如果您只检查Math.max函数的其中一个输入,您将看到出现了什么问题

// Random array
var a = [1, 2, 3, 4];

// The join
console.log(a.join()); // "1,2,3,4"

// Try to convert the join to a Number
console.log(Number(a.join())); // NaN

// Try getting a max out of the join. Your case here
console.log(Math.max(a.join())); // NaN