2017-12-01 9 views
-1

私は、次のオブジェクト配列を持っています。これは常に3つのオブジェクトから構成されます。 大きい値を含むオブジェクトを2つの他のオブジェクトと比較して返したいと思います。JavaScriptで最大のオブジェクト配列を抽出する

先行オブジェクトの値の合計は、前のものよりも大きいか等しいことになります。前のオブジェクトが前のものと同じ値の合計を返すときは、値1と値2が完全に一致する必要があります。例えば、sum(data [2])== sume(data [1])の場合、data [2]の値1はdata [1]の値1と等しく、data [2]のvalue2はdata [1]のvalue1と等しいので、どちらか一方だけ返すことができます。

私はこれを基本的な方法で行う方法を知っていると思いますが、これを行う最もエレガントな方法は何ですか?

follwoing例では、Iは、データを返すしたい(値1 + VALUE2)によるもの[2]

data = [{ 
     Area: 'HongKong', 
     value1: 163, 
     value2: 175, 
     DateCreated: 2017 - 11 - 28T17: 59:00.740Z }, 
    { 
     Area: 'HongKong', 
     value1: 163, 
     value2: 176, 
     DateCreated: 2017 - 11 - 28T17: 59:16.747Z }, 
    { 
     Area: 'HongKong', 
     value1: 165, 
     value2: 176, 
     DateCreated: 2017 - 11 - 28T17: 59:32.750Z }] 
    }) 
+1

* "以前のオブジェクトは、値(値1、値2)いずれかをprceeding以上でのSUMEもありません" * - これは意味してい配列は値の合計で順序付けられますか?もしそうなら、あなたは配列の最後の要素を取るだけではありませんか? – cdhowie

+1

'私は次のオブジェクト配列を持っています。これは常に3つのオブジェクト内部で構成されます。'、 'Constraint:以前のオブジェクトは値1の値(value1、value2)を持つことはありません。 2]は常に**解決策です。 – briosheje

+0

混乱して申し訳ありません、私は質問を更新しました。ありがとう –

答えて

2

const data = [{ 
 
     Area: 'HongKong', 
 
     value1: 163, 
 
     value2: 175, 
 
     DateCreated: "2017 - 11 - 28T17: 59:00.740Z" }, 
 
    { 
 
     Area: 'HongKong', 
 
     value1: 163, 
 
     value2: 176, 
 
     DateCreated: "2017 - 11 - 28T17: 59:16.747Z" }, 
 
    { 
 
     Area: 'HongKong', 
 
     value1: 165, 
 
     value2: 176, 
 
     DateCreated: "2017 - 11 - 28T17: 59:32.750Z" 
 
    } 
 
]; 
 

 
t0 = performance.now(); 
 
console.log(data.sort((a, b) => -(a.value1 + a.value2))[0]); 
 
t1 = performance.now(); 
 
console.log("sort took " + (t1 - t0) + " milliseconds."); 
 

 
// This the more appropriate way (faster) 
 
t0 = performance.now(); 
 
console.log(data.reduce((a,b)=> (a.value1+a.value2) > (b.value1+b.value2) ? a:b)) 
 
t1 = performance.now(); 
 
console.log("reduce took " + (t1 - t0) + " milliseconds.");

+0

何がありますか? a:bは平均ですか? –

+0

これはelseの場合の省略形です。 aの和がbより大きい場合、a else b – nullqube

+0

を参照してください。reduce()はオブジェクトの文字列をどのように処理しますか?それは内部の任意の文字列を除外しますか? –

0

ソートと最初のオブジェクトを取得します。

しかし、私が明確にしていないのはあなたのNo previous object will have sume of values(value1,value2) larger or equal than prceeding oneです。その場合、data[2]は常に答えになるでしょうか?それ以上にエレガントなものは何ですか?

const data = [{ 
 
     Area: 'HongKong', 
 
     value1: 163, 
 
     value2: 175, 
 
     DateCreated: "2017 - 11 - 28T17: 59:00.740Z" }, 
 
    { 
 
     Area: 'HongKong', 
 
     value1: 163, 
 
     value2: 176, 
 
     DateCreated: "2017 - 11 - 28T17: 59:16.747Z" }, 
 
    { 
 
     Area: 'HongKong', 
 
     value1: 165, 
 
     value2: 176, 
 
     DateCreated: "2017 - 11 - 28T17: 59:32.750Z" 
 
    } 
 
]; 
 

 
console.log(data.sort((a, b) => (b.value1 + b.value2) - (a.value1 + a.value2))[0]) 
 

 
console.log(data.sort((a, b) => (a.value1 + a.value2) - (b.value1 + b.value2))[data.length-1]) 
 

 
console.log(data.sort((a, b) => (a.value1 + a.value2))[0])

+1

console.log(data.sort((a、b)=> - (a.value1 + a.value2))[0])これは十分でしょう – nullqube

+0

それは正しいですが、それは 'data.sort (a、b)=>(a.value1 + a.value2))[0] 'マイナス符号は最小値を返します。 –

+0

ソートは最小値から最大値に戻り、マイナス記号はそれを逆にするので、[0]は最大値を返します。コード – nullqube

関連する問題