所以我正在构建一段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不起作用。
答案 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
给定数字中最大的一个。如果至少有一个参数无法转换为数字,则返回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