2016-02-16 31 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]]);