在javascript中迭代数组数组

时间:2015-09-04 08:17:05

标签: javascript arrays

我是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]]);

5 个答案:

答案 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);
    });
}

http://jsfiddle.net/bLn3k14n/

答案 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))