2017-10-18 3 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

'jr'のループの中で' arr [i] 'をソートしていますが、どういう意味ですか?それはちょうど同じソート操作を何回か実行するつもりです。 – CBroe

+1

*動作していない*は、全く意味のない問題の説明です。ここで助けが必要な場合は、**具体的に**してください。それはどのように動作するように意図されていますか、**具体的に**それが意図されている方法で動作していませんか? –

答えて

0

あなたはすべてのアレイから最大N値を得るために探している場合は、並べ替え、リストを平らにし、出来上がりができます。

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

(あなたが最大の「数字」ではない「数」をしたいと言ったので)あなたが最大のSUMを持つ配列を探しているなら、あなたのような何かができる:

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

A所定の位置に基本的な機能を取得する最初のパスのリファクタリングは、最大値を抽出するために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] }); 
} 

第2のパスがちょうどmapよりaggressを使用することを含みます代わりにsortmaxを使用してivelyなど:

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

この数値の並べ替えを行うために必要な醜いsort(function(a,b) { ... })ジャンク側は、繰り返します。

0

コードには多くの問題があります。

  • あなたはその配列にn回をソートしているnサイズの配列のための意味、それらを介してループしている間は、内側の配列をソートしています。これは不必要に非効率的です。
  • max/min要素が必要な場合は、並べ替えは効率的ではありません。ソートは一般にO(n log n)の操作ですが、配列をループするだけでO(n)(詳細はBig O notationを参照してください)。
  • あなたのコードは内部配列をソートしていますが、結果(つまりソートされた内部配列の最初の要素)は何もしません。
  • 戻り値として配列 'インプレース'を変更することを意図している場合は、関数から何も返さず、入力配列を変更して結果を格納することもありません。

は、これらの問題を解決するには、次の

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] 
 
]));

01:

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メソッドを使用します

関連する問題