我是javascript的新手,我不知道如何迭代数组中的数组 JavaScript的。
我有一个问题,我必须从数组输入数组中找到最大的数组:
返回一个数组,其中包含每个提供的最大数字 子阵列。为简单起见,提供的数组将包含4个 子阵列。请记住,您可以使用简单的迭代遍历数组 for循环,并使用数组语法arr [i]
访问每个成员
我成功地解决了第一个问题,我的代码是我最后编写的,但是我无法解决第二个输入问题。
问题1 [已解决]
输入:largestOfFour( [[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39],[1000,1001, 857, 1]] );
输出:[1000,1001,857,1]
问题2 [未解决]
输入:largestOfFour( [[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]), [27,5,39,1001] );
输出:[27,5,39,1001]
如果仍然不清楚,请观看此链接并告诉我这就是
http://freecodecamp.com/challenges/bonfire-return-largest-numbers-in-arrays
我的代码第一个问题。 (改变我的代码,以便第二个可以解决)
function largestOfFour(arr) {
var iAmLarge = new Array();
iAmLarge = arr[0];
var large = iAmLarge[0];
for(var i=0;i<iAmLarge.length;i++) {
if(large<=iAmLarge[i] ) {
large = iAmLarge[i];
}
}
var maxFoundAt = 0;
for(var i=0;i<arr.length;i++){
var newArray=new Array();
newArray = arr[i];
var max = newArray[0];
for(var j=0;j<newArray.length;j++) {
if(max<newArray[j] ) {
max = newArray[j];
}
}
if(max>=large) {
large = max;
maxFoundAt = i;
}
}
alert( arr[maxFoundAt]);
}
largestOfFour( [[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]]);
答案 0 :(得分:3)
对于要从每个子数组中收集最大数字的第二个问题,您可以执行此操作(工作代码段):
function largestOfFour(master) {
var result = [];
// iterate through all arrays passed
for (var i = 0; i < master.length; i++) {
// master[i] is an array and can be just treated like any array
result.push(Math.max.apply(Math, master[i]));
}
return result;
}
var r = largestOfFour( [[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
// show result in snippet
document.write(JSON.stringify(r));
为了解释一下,Math.max.apply(Math, array)
是查找数组中最大值的技巧。它的工作原理如下:
Math.max()
接受你想传递的参数。例如,您可以执行Math.max(1,2,3,4,5,6)
,它将返回6
。所以,如果你可以传递一个完整的参数数组,那么它会在整个数组中找到最大值。
那么,如何将值数组转换为函数的一组参数。好吧,你可以使用.apply()
来做到这一点。它是Javascript中任何函数的一种方法。你可以阅读here on MDN。因此,由于Math.max()
是一个函数,我们可以使用Math.max.apply()
来使用值数组作为Math.max()
的参数。 .apply()
本身接受两个论点。第一个是您希望函数具有的this
值。事实证明,这并不是真正相关的,所以我们通过Math
,它只给.max()
函数提供与我们称之为this
时相同的Math.max()
值。 .apply()
的第二个参数是一个值数组,我们希望它们是函数的参数。为此,我们只是传递我们的数组。所以,我们最终得到:
Math.max.apply(Math, myArray);
找到myArray中的最大值。为了了解这是如何工作的,我们假设我们有:
var myArray = [9,8,7,1];
var highest = Math.max.apply(Math, myArray);
这与此相同:
var highest = Math.max(9,8,7,1);
Math.max.apply(Math, myArray)
获取myArray
中的值数组,并将它们作为连续参数传递给Math.max()
,就好像我们将它们作为参数手动输入到我们的代码中一样。
并且,在上述两种情况下,highest === 9
。
答案 1 :(得分:2)
您已(在评论中和所提供的链接中)说明了问题集
返回一个数组,该数组由每个提供的子数组中的最大数字组成。为简单起见,提供的数组将包含4个子数组。请记住,您可以使用简单的for循环遍历数组,并使用数组语法arr [i]
访问每个成员
这意味着您需要做的是迭代每个数组并从每个数组中找到最大数字,并返回包含每个子数组中最大数字的数组。因此输入:
[[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39],[1000,1001, 857, 1]]
应该产生
的回应[5,27,39,1001]
为了在编程中实现任何目标,您应该将一个复杂的问题分解为一个或多个更简单的问题 - 这通常会导致编写一个函数来执行一小部分功能。
从一个简单的一维数组开始
[4, 5, 1, 3]
编写一个函数来查找该数组中的最大数字。
function getLargestFromArray(arr){
// You can do this bit!
// Its easy, just store zero in a variable, and iterate the array
// if the current value is greater than the stored number
// set the stored number to this value
// when youve iterated all values return the currently stored highest number
}
现在,您知道您的原始输入将是一个包含4个数组的数组(赋值如此!)因此您可以使用数字4来迭代输入
var output = new Array();
for(var i=0;i<4;i++){
var thisArr = input[i];
var highest = getLargestFromArray(thisArr)
output[i] = highest; // or output.push(highest);
}
就这么简单!
答案 2 :(得分:1)
var a = [[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]];
var temp = [];
for (var i = 0; i < a.length; i++) {
temp.push(a[i].sort(function(a, b){return b - a;})[0]);
}
console.log(temp);
答案 3 :(得分:1)
这适用于任意数量的子数组,因此我将名称更改为maxOfSubArrays
或类似名称。它与@Jamiec解决方案类似,但使用map函数将max函数应用于每个子数组,您不需要在主数组上循环。
function largestOfFour(arrayOfArrays) {
return arrayOfArrays.map(function (singleArray) {
return Math.max.apply(null, singleArray);
});
}
答案 4 :(得分:0)
这里的答案真的已经过时了。使用数组映射函数,只需从每个数组中获取最大值。
function largestOfFour(arr) {
return arr.map(m=>Math.max(...m));
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
使用箭头语法
可以进一步简化该功能const largestOfFour=a=>a.map(m=>Math.max(...m))