2016-02-16 80 views
-3

返回由每个提供的子数组中最大数组成的数组。为了简单起见,提供的数组只包含4个子数组。 我正在输出[27,27,39,1001],但输出应该是[27,5,39,1001]。返回javascript中数组中最大的数字

function largestOfFour(arr) { 
    // You can do this! 
    var largest=[]; 
    var gr=0; 
    for(var i=0;i<arr.length;i++){ 
    for(var j=0;j<=arr[i].length;j++){ 
     if(arr[i][j]>gr){ 
     gr=arr[i][j]; 

     } 
    } 
    largest.push(gr); 
    } 
return largest; 

} 


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

问题是什么? – Pointy

回答

0

这是一个更干净的方式来做到这一点,但如果你关心的很快,它会比较慢。

function get_array_of_largest(rank2Array){ 
    var newArray = []; 
    for (var i = 0; i < rank2Array.length; i ++){ 
    newArray.push(rank2Array[i].slice().sort(function(a, b){return a < b;})[0]); 
    } 
    return newArray; 
} 

.slice()复制数组的一部分。由于没有给出任何论据,它复制整个事情。 .sort()根据函数对数组进行排序。给定我使用的排序函数,它按降序排列数组(元素0因此是最大的)。

你不工作的原因是你没有重新设置gr为0后,你推动元素。

+1

不是我的投票(它真的很烦人没有解释得票),但排序修改了原始数组,并在这里效率低下。 – RobG

+0

@RobG啊,谢谢澄清! –

1

即使如此,它看起来像一个测试问题,并没有一个明确的问题。我会继续并帮助你。

var arr = [[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]; 
var res = []; 
arr.forEach(function(val, ix){ 
var sub = val; 
var large = 0; 
for(var i=0;i<sub.length;i++){ 
    if(sub[i] > large){ 
    large = sub[i]; 
} 
} 
res.push(large); 
}); 

小提琴:https://jsfiddle.net/jeremyrajan/hted9eg5/

,如果你看一下代码,我使用的forEach(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)遍历数组,并收集子阵。然后通过元素运行for-loop查找最大数量。

唯一的区别是,我使用forEach在我的情况,使事情变得更漂亮。

希望有帮助!

+0

使用forEach不会让它看起来更漂亮,但更丑陋。 –

+0

当一个子数组包含所有负数时,Jeremy会发生什么?另外,使用['.map'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)更加优雅。 'let largest =(... arrays)=> arrays.map(array => Math.max.apply(Math,array));' – Oka

+0

@Oka,好点:)。要改变这一个!干杯。 –

3

你的逻辑很不对。要指出错误,请参阅下文。
迭代1
      - > GR = 0
      - > 27> 0?
      - > GR = 27
      - >推GR(27)

迭代2
      - > GR = 27
      - > 5> 27?
      - >推GR(27)

迭代3
      - > GR = 27
      - > 39> 27?
      - > GR = 39
      -push GR(39)

迭代4
      - > GR = 1001
      - > 1001> 39?
      - > GR = 1001
      - >推GR(1001)

尝试创建与获取该参数的最大数目的阵列参数的函数,而不是声明一个新的for循环。

Array.max = function(array){ 
    return Math.max.apply(Math, array); 
}; 
+0

* gr *应该初始化为[* Number.MIN_VALUE *](http://www.ecma-international.org/ecma-262/6.0/#sec-number.min_value),或者可能是* NaN *,因为数组可能包含负数。 – RobG

1

你可以尝试这样的事情:

var data = [[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]; 
 
var maxArr = data.map(function(item){ 
 
    return Math.max.apply(null,item) 
 
}); 
 

 
document.write(maxArr);

代码的说明:

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

 
} 
 

 
var r = largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]); 
 
document.write(r)

您编码的作品文件,但问题是与var gr=0;。这是在for loop之外初始化的,所以它比较第一个数组的最大数量和第二个数字,因为27>5是假的,它只分配了27。

function largestOfFour(arr) { 
 
    // You can do this! 
 
    var largest = []; 
 

 
    for (var i = 0; i < arr.length; i++) { 
 
    var gr = 0; 
 
    for (var j = 0; j <= arr[i].length; j++) { 
 
     if (arr[i][j] > gr) { 
 
     gr = arr[i][j]; 
 
     } 
 
    } 
 
    largest.push(gr); 
 
    } 
 
    return largest; 
 

 
} 
 

 
var r = largestOfFour([ 
 
    [13, 27, 18, 26], 
 
    [4, 5, 1, 3], 
 
    [32, 35, 37, 39], 
 
    [1000, 1001, 857, 1] 
 
]); 
 
document.write(r)

你需要为每个迭代复位gr这个值,因此,它应该内环路初始化。

+0

只需发布代码并不真正有帮助。 OP的逻辑有问题,所以你需要解释他们为什么会遇到问题以及如何解决问题。 – RobG

+0

@RobG感谢您指点。解释了这个问题和另一个解决方案。 – Rajesh

2

你的功能是正确的,但你需要把var gr = 0;内第一个for循环:

function largestOfFour(arr) { 
    // You can do this! 
    var largest=[]; 
    for(var i=0;i<arr.length;i++){ 
    var gr=0; 
    for(var j=0;j<=arr[i].length;j++){ 
     if(arr[i][j]>gr){ 
     gr=arr[i][j]; 

     } 
    } 
    largest.push(gr); 
    } 
return largest; 
} 

largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]); 
0
function largestOfFour(arr) { 
    var newArr=[]; 
    for(i=0;i<arr.length;i++){ 
    var num=Math.max.apply(null,arr[i]);  
    newArr.push(num); 
    } 
    return newArr; 
} 

以下函数使用Function.prototype.apply的()来查找在一个数值数组的最大元素。 getMaxOfArray([1,2,3])等价于Math.max(1,2,3),但是您可以在任意大小的以编程方式构造的数组上使用getMaxOfArray()。

function getMaxOfArray(numArray) { 
    return Math.max.apply(null, numArray); 
} 
2
function largestOfFour(arr) { 
    var results = []; 
    for (var n in arr) { 
     var largestNumber = 0; 
     for (var num in arr[n]) { 
      if (arr[n][num] > largestNumber) { 
       largestNumber = arr[n][num]; 
     } 
    } 
    results[n] = largestNumber; 
    } 
    return results; 
    } 

largestOfFour([[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]]);