2012-06-22 20 views
9

多次元配列内の最大値取得:私は次のような配列を持っているJavaScriptやCoffeeScriptの

array = [[1, 5], [4, 7], [3, 8], [2, 3], 
[12, 4], [6, 6], [4, 1], [3, 2], 
[8, 14]] 

私は必要なものは、この場合ので、セットの最初の値から最大の数であります12。 オンラインいくつかの例を見ると、私はこれを達成するために見て最善の方法は次のとおりです。

Math.max.apply Math, array 

問題は、単一次元配列でのみ動作です。私はどのように私のシナリオのためにこれを組み込むだろうか? (jqueryのは許さ)


エンド・ソリューション:

それは問題の一部ではありませんでしたが、私は配列から最小値と最大値の両方を必要とし、それは、物事を少し変更します。

unless device.IE 
     justTheDates = magnitudeArray.map (i) -> i[0] 
     @earliest  = Math.min.apply Math, justTheDates 
     @latest   = Math.max.apply Math, justTheDates     
    else 
     @earliest  = magnitudeArray[0][0] 
     @latest   = magnitudeArray[0][0] 
     for magnitudeItem in magnitudeArray 
      @earliest = magnitudeItem[0] if magnitudeItem[0] < @earliest 
      @latest  = magnitudeItem[0] if magnitudeItem[0] > @latest 

答えて

13

その使用後にあなたは.reduce() ...

を使用することができます
array.reduce(function(max, arr) { 
    return Math.max(max, arr[0]); 
}, -Infinity) 

ここMath.max ...

array.reduce(function(max, arr) { 
    return max >= arr[0] ? max : arr[0]; 
}, -Infinity); 

を使用していないバージョンだ...とjsPerf test。 CoffeeScriptの中で理解を使用して

+3

+1古典的な折り畳みの例の場合:)。 Aコーヒースクリプト[翻訳](http://coffeescript.org/#try:array%20%3D%20 [[1%2C%205]%2C%20 [4%2C%207]%2C%20 [3% 2C%208]%2C%20 [2%2C%203]%0A%0Amax%20%3D%20アレイ%20%28%28%2C%20%%29%20%%3E%20Math.max% (max、arr) - > Math.max max、arr [0])、 - 最大値、最小値、最小値、最小値、最小値、最小値、最小値、最小値、 Infinity' – epidemian

+0

私はこの回答に対してより多くの票を見ています。誰かがそれについてのケースを作ることに興味を持っているだろうか? – Fresheyeball

+1

@Fresheyeball:私は、他のものよりも優れているとは言いたくありません。 '.reduce()'は配列を単一の値に評価するだけです。 '.map()'は基本的に '.reduce()'で、新しいコレクションに評価します。したがって、 '.map()'の振る舞いは '.reduce()'を使って次のようにして実現することができます: 'array.reduce(function(arr、curr){arr.push(curr [0]); return arr;}、 ]) '。そしてあなたはまだ 'Math.max.apply ... 'を使います。 '.apply'で' .map() 'スタイルを使用する利点は、繰り返される' Math.max'呼び出しを避けることです。数字を直接減らすことの利点は、おそらく少し明確です。 –

8

http://jsfiddle.net/zerkms/HM7es/

var max = Math.max.apply(Math, arr.map(function(i) { 
    return i[0]; 
}));​ 

だから、最初にあなたが平らなものに2次元配列に変換するためにarray.map()を使用し、Math.max()

+0

私は.mapに精通していませんが、何が起こっているのか説明できますか? – Fresheyeball

+0

@Fresheyeball:https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Array/map ---これにより、各要素にコールバックが適用されます。あなたの場合、各 'i'は2要素の' [1,5] '配列で、最初の項目を返します。 'arr.map()'が適用された後、あなたは各入れ子配列の最初の要素を含む別の配列を持っています – zerkms

+0

私の質問は...でしょうか? – Fresheyeball

1

また
Math.max.apply Math, (x[0] for x in array) 

Running example

+1

スプラット[仕事もできる](http://jsfiddle.net/6ymfx/1/): 'Math.max(xは配列x)...' :) – epidemian

1

、_underscore.jsを見てください。 Here is a link to the function _max().

  • 読み取り、書き込み、および維持する方が簡単です。

_underscoreの最も重要な部分は、_maxに似た約100のヘルパー関数が存在することです。並べ替えのように。

は、以下の構文を比較します

var sortedObject = _.sortBy(object, function(val, key, object) { 
    return val; 
}); 

彼らがチェーンに容易であり、解釈します! (Douglas Crockfordの示唆のように)

優れたJSFIDDLEは、this post by @Raynosで提供されました。

生のJavaScriptで一貫して配列操作を行っている場合は、_underscore.jsをチェックすると、コードが大幅に単純化されます。

希望があれば、 すべてベスト!

ナッシュ
+1

"これは単に効率的です" ---ライブラリが基礎となる言語よりも効率的になる方法はありますか? – zerkms

+0

良い質問、より効率的な書き込み(読み込み、保守)。 @zerkmsの説明をありがとう。 +1。編集されました。 –

+1

私は新しいlibをすべて含めるつもりはなく、これを解決するだけです。 – Fresheyeball

2

中間体アレイを生成回避Underscore.js' maxを使用して簡単な解決策:

max = _(array).max(_.first)[0] 

JSFiddle

+0

私は新しいlibをすべて含めるつもりはなく、これを解決するだけです。 – Fresheyeball

+1

OK、他の解決策がうまくいく:)。アンダースコアには、私の経験上、かなり頻繁に使用される多くの有用な小さな機能があります。それは4KBしかないので、ライブラリのサイズのせいであれば、それを含めて膨大に膨らんでしまう危険はありません。 – epidemian

1
Array.prototype.maxX = function(){ 
    return Math.max.apply(Math,this.map(function(o){return o[0];})); 
}; 
0

サンプル入力: largestOfFour([[4、5 、1,3]、[13,27,18,26]、[32,35,37,39]、[1000,1001,857,1])。

function largestOfFour(arr) { 

    var largest = 0; 
    var largestArr = []; 
    for(var i=0; i<arr.length; i++){ 
     for(var j=0; j<arr[i].length; j++){ 

     if(largest < arr[i][j]){ 
      largest = arr[i][j]; 
     } 
     largestArr[i] = largest; 
     }  
     largest = 0; 
    } 

    return largestArr; 
} 

2つのdim配列から新しい配列に最大の数値を入力できます。

1

私はこれは古い記事ですけど、あなた(または他の誰か)が、アレイ全体で最大の数をしたい場合は、してみてください:このexamlpeで

var array = [[1, 5], [4, 7], [3, 8], [2, 3], 
[12, 4], [6, 6], [4, 1], [3, 2], 
[8, 14]]; 

var max = array.reduce(function (max, arr) { 
    return max >= Math.max.apply(max, arr) ? max : Math.max.apply(max, arr); 
}, -Infinity); 
console.log(max); 

、それは値14を返します。

関連する問題