搜索由子阵列组成的数组,用于新数组中的最大数字和返回

时间:2015-06-28 00:03:44

标签: javascript arrays loops for-loop

我正在编写一个编码挑战来获取一个由子数组组成的给定数组,搜索每个子数组中最大的数字,最后返回一个只包含最大数字的新数组。我的思考过程是从每个子数组中创建变量,编写比较数组中每个值的for循环,然后将最大值推送到新数组。在编写了我的第一个for循环之后,我测试了我的代码并看到我得到了一个意外的结果,即整个第一个子阵列被推入我的新数组中。在编写接下来的三个循环之前,我正在寻找错误。谢谢。编辑:这适用于初学者JavaScript编码器,建议表明在解决方案中使用比较运算符。

function largestOfFour(arr) {
      var one = arr[0];
      var two = arr[1];
      var three = arr[2];
      var four = arr[3];
      var newArr = [];

      for (var i = 0; i < one.length; i++){
        var oneLrg = 0;
        if (one[i] > oneLrg){
          oneLrg = one[i];
          }
        newArr.push(oneLrg);
      }  

  return arr;
}

console.log(largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]])); //This test case returns [4,5,1,3] instead of just [5]

9 个答案:

答案 0 :(得分:12)

使用>

var newArr = [];
for(var i=0; i<arr.length; ++i) {           // Iterate array
  var maximum = -Infinity;                  // Initial maximum
  for(var j=0; j<arr[i].length; ++j)        // Iterate subarrays
    if(arr[i][j] > maximum)                 // Compare
      maximum = arr[i][j];                  // Update maximum
  newArr.push(maximum);                     // Store the real maximum
}

使用Math.max

var newArr = [];
for(var i=0; i<arr.length; ++i) {           // Iterate array
  var maximum = -Infinity;                  // Initial maximum
  for(var j=0; j<arr[i].length; ++j)        // Iterate subarrays
    maximum = Math.max(maximum, arr[i][j]); // Update maximum
  newArr.push(maximum);                     // Store the real maximum
}

添加apply

var newArr = [];
for(var i=0; i<arr.length; ++i)     // Iterate array
  newArr.push(                      // Store ...
    Math.max.apply(Math, arr[i])    // ... the maximum of the subarray
  );

添加ECMAScript 5 map

var newArr = arr.map(function(subarray) {
  return Math.max.apply(Math, subarray);
});

添加ECMAScript 5 bind

var newArr = arr.map(Function.apply.bind(Math.max, Math));

或添加ECMAScript 6 arrow functionsspread operator

var newArr = arr.map(subarray => Math.max(...subarray));

答案 1 :(得分:1)

这里的问题是你在每次循环迭代时覆盖oneLrg,并在相同的循环内推送它,所以你要将每个值比较为0然后,因为one[i]更大保存它。

试试这个:

var oneLrg = 0;
for (var i = 0; i < one.length; i++){
    if (one[i] > oneLrg){
        oneLrg = one[i];
    }
}
newArr.push(oneLrg);  

答案 2 :(得分:1)

毫无疑问,@ Austin Hansen和我正在利用相同的学习环境来应对这一挑战:免费代码营。

我自己完成了这个挑战(FCC称之为“Bonfires”),我想我会提供与@Oriol优秀的“&gt;”完全吻合的解决方案。溶液

我已经包含了关于代码块的特定说明,因为对于我们新手(在FCC或其他地方),缺少这样的代码可以让我们适合几个小时:)

function largestOfFour(arr) {
 var finalArray = [];     
 for(i = 0; i < arr.length; i++) { // iterates through each array
   var max = -Infinity;
   for(j = 0; j < arr[i].length; j++) { // iterates through each sub-array 
      if(arr[i][j] > max) { // comparing each successive element within the sub-array to what is currently stored as max
        max = arr[i][j]; //if the ">" comparison is true then max gets updated
      }  
    }
    finalArray.push(max); // ensure this is OUTside of the j for loop. putting it INside the j for loop returns a very long (and wrong) array. try it. 
  }
  console.log(finalArray);
  return finalArray;
}

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

https://jsbin.com/puweci/edit?js,console

FCC认可以下解决方案,该解决方案不利用Array.push()。

function largestOfFour(arr) {
  var results = [];
  for (var i = 0; i < arr.length; i++) {
     var max = -Infinity;
     for (var j = 0; j < arr[i].length; j++) {
        if (arr[i][j] > max) {
        max = arr[i][j];
        }
     }

    results[i] = max;
  }

  return results;
}

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

答案 3 :(得分:0)

此功能将使用两个数字并返回其最大值:

var greatest = function(a,b){ return Math.max(a,b); };

此函数将获取一组数字并依次将greatest函数应用于每个数字(使用数组的.reduce( callbackFunction, initialValue )方法)以获取数组中的最大值:

var findMaximum = function( arr ){ return arr.reduce( greatest, Number.NEGATIVE_INFINITY ); };

只需使用所有数组值调用findMaximum即可简化Math.max()函数(无需greatest函数);像这样:

var findMaximum = function( arr ){ return Math.max.apply( Math, arr ); };

此函数将获取一个数组(数组)并在其中的每个元素上调用findMaximum并返回包含这些最大值的新数组(在数组上使用.map( callbackFunction )方法):

var largestOfFour = function( arr ){ return arr.map( findMaximum ); };

答案 4 :(得分:0)

这篇文章在大约3个月内没有任何新的更新,但我想我会发布我的解决方案来解决这个问题,因为它看起来与迄今为止发布的大多数其他解决方案略有不同。认为有人可能会发现它有用!

我正在使用相当多的内置方法函数(.forEach,.sort,.push,.shift)如果您不确定它们是如何工作的,那么快速谷歌搜索将会很好地解释每一个。 https://developer.mozilla.org是这些资源的绝佳资源。

function largestOfFour(arr) {
  var newArr = [];                              //set up new empty array
  arr.forEach(function(subArr){                 //iterate through array with .each function
    subArr.sort(function(a, b){                 //use .sort to place largest number of each subarray into index[0]
      return a < b;     
    });
    newArr.push(subArr.shift());                //use .push method to .shift the index[0] number to newArr
  });
  return newArr;                            
}

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

答案 5 :(得分:0)

你可以看看这个:

function largestOfFour(arr) {
  var newArr=[];
  largestnum=0;
  for(i=0;i<arr.length;i++)
    {
      for(j=0;j<4;j++)
        {
      if(arr[i][j]>largestnum)
        largestnum=arr[i][j];
        }
       newArr.push(largestnum);
      largestnum=0;
    }
return newArr;
}

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

答案 6 :(得分:0)

@orion - 你对我的回答没有用。如果推送在if语句中,则推送的数字不是假设在数组中。结果,第一个推动[4,5]并且伤口工作。所以我将push语句移出for语句并将lgstNumber重置为0,因此它不会将它用于下一个子数组。这对我有用......

function largestOfFour(arr) {
  // You can do this!
  var newArr = [];
  var lgstNumber = -  Infinity;
  for(var i = 0; i < arr.length; i++){
    for(var j = 0; j < arr[i].length; j++){
      if(lgstNumber < arr[i][j]){
        lgstNumber = arr[i][j];
      }
    }
    newArr.push(lgstNumber);
    lgstNumber = 0;
  }
  return newArr;
}

答案 7 :(得分:0)

function largestOfFour(arr) {
    return arr.map(function(subArray) {
        return subArray.reduce(function(firstArray, secondArray) {
            return firstArray > secondArray ? firstArray : secondArray;
        });
    });
}
largestOfFour([[13, 27, 18, 26],[4, 5, 1, 3],[32, 35, 37, 39],[1000, 1001, 857, 1]
]);

答案 8 :(得分:0)

效率更高。

function largestOfFour(arr) {


  for(var x=0;x<arr.length;x++)
    {
       for(var y=0;y<arr[x].length;y++)
        {
           arr[x]=arr[x].sort(function(a,b)
                   {
         return b-a;
       });

     }
}
  var array=[];
  for(var a=0;a<arr.length;a++)
{
  for(var b=0;b<arr[a].length;b++)
    {
      if(b==0)
        {
          array[a]=arr[a][b];
        }
    }


}
  return array;

}

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