我正在编写一个编码挑战来获取一个由子数组组成的给定数组,搜索每个子数组中最大的数字,最后返回一个只包含最大数字的新数组。我的思考过程是从每个子数组中创建变量,编写比较数组中每个值的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]
答案 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 functions和spread 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]]);