2017-10-18 53 views
-1

我想要一組陣列中找到最大的號碼,並將其返回到新的數組返回人數最多。但我不明白爲什麼我的代碼不工作。你能解釋我的錯誤嗎?在陣列

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

 
    } 
 
    } 
 
} 
 

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

+0

「不工作」是指什麼?你有錯誤嗎?你的輸出是不是你所期望的? – tadman

+3

你正在''ar' [i]'循環內對'j'進行排序,這應該是什麼意思?這只是多次執行相同的排序操作。 – CBroe

+1

*不工作*是一個絕對沒有意義的問題描述。如果你想在這裏獲得幫助,請** **具體**。它是如何工作的,以及特別是**如何不按照它的方式工作? –

回答

0

如果你正在尋找從所有陣列得到最大ñ值,你可以扁平化的列表,排序,瞧。

var arrayOfArrys = [[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]; 
var flattened = []; 

for (var _i = 0, arrayOfArrys_1 = arrayOfArrys; _i < arrayOfArrys_1.length; _i++) { 
    var arr = arrayOfArrys_1[_i]; 
    flattened = flattened.concat(arr); 
} 

var sorted = flattened.sort(function (a, b) { 
    return b - a; 
}); 

alert(JSON.stringify(sorted)); 
0

如果你正在尋找具有最大和的數組(因爲你說你想要最大的「數字」而不是「數量」),你可以這樣做:

function largestOfFour(arr) { 
    var sums = []; 
    for(var i = 0; i < arr.length; i++){ 
     var arraySum = 0; 
     for(var j = 0; j < arr[i].length; j++){ 
     arraySum+=arr[i][j]; 
     } 
     sums.push({array: arr[i], sum: arraySum}); 
    } 
    return sums.sort(function(a,b){return b.sum - a.sum})[0].array; 
} 
0

一第一遍重構,可推動在地方的基本功能包括使用map提取最大值:

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

    } 
    } 

    // Extract the first element from each array. 
    return arr.map(function(a) { return a[0] }); 
} 

第二遍只涉及使用map更搶攻結構延續以及使用max代替sort

function largestOfFour(arr) { 
    return arr.map(function(a) { 
    return Math.max.apply(null, a); 
    }); 
} 

這側步驟做一個數值排序所需的醜陋sort(function(a,b) { ... })垃圾。

0

您的代碼已經得到了很多的問題。

  • 你,而你通過他們循環,意爲大小的數組n你排序數組n時間排序內陣列。這不必要的低效率。
  • 如果你只是想要最大/最小的元素,那麼排序是無效的;在一般分選被一個爲O(n log n)的的操作,但只通過該陣列循環是爲O(n)(參見Big O notation獲得更多信息)。
  • 雖然你的代碼排序內部數組,你沒有做任何事情,結果(即排序的內部數組的第一個元素)。
  • 不必返回從函數的任何信息或修改輸入數組包含的結果(如果目的是修改「就地」數組作爲返回值)。

要解決這些問題:

function largestOfFour(arr) { 
 
    var result = [], max, jMax; 
 
    for (var i = 0; i < arr.length; i++) { 
 
    max = arr[i][0]; 
 
    for (var j = 1; j < arr[i].length; j++) { 
 
     if (max < arr[i][j]) 
 
     max = arr[i][j]; 
 
    } 
 
    result.push(max); 
 
    } 
 
    
 
    return result; 
 
} 
 

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

或者更乾淨,使用mapreduce方法:

function largestOfFour(arr) { 
 
    return arr.map(function(x) { 
 
    return x.reduce(function(a, c) { 
 
     return c < a ? a : c; 
 
    }); 
 
    }); 
 
} 
 

 

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