2017-10-02 3 views
2

ネストされたプロパティによってソートする_.orderBy()メソッドによって返された最初のオブジェクトのキーを返したいとします。Lodashでソートされたプロパティのキーを取得する

Here is the CodePen demo.この場合、返すキーは"charlie"です。

console.clear(); 

const ob = { 
    "alpha": { 
    "id": 27, 
    "lottery": { 
     "id": 1, 
     "name": "La Primitiva", 
     "jackpotAmount": 500, 
    }  
    }, 
    "bravo": { 
    "id": 28, 
    "lottery": { 
     "id": 1, 
     "name": "La Primitiva", 
     "jackpotAmount": 10, 
    }  
    }, 
    "charlie": { 
    "id": 29, 
    "lottery": { 
     "id": 1, 
     "name": "La Primitiva", 
     "jackpotAmount": 1000, 
    }  
    }, 
} 

const out = _.orderBy(ob, (e) => { 
    return e.lottery.jackpotAmount; 
}, ['desc']); // How do I get key of first property, "charlie"? 

console.log(out); 

答えて

3

これは、最高のjackpotAmountを取得する最も効率的な方法ではありません。ソートはO(n log n)です。あなたはO(n)時間で最高値を見つけることができます。また、一時的な操作のために余分なメモリを大量に使用するように、リストの一時コピーを作成しています。 _.maxBy()を使用するほうが効率的です。

var x = _.maxBy(ob, (e) => { return e.lottery.jackpotAmount; }); 
return x.id; 

これらの機能はリストで機能します。アイテムではなくキーを取得するには、キーを反復処理する必要があります。

var keys = Object.keys(ob); 
return _.maxBy(keys, (e) => { return ob[e].lottery.jackpotAmount; }); 

これは完全に効率の問題を解決しないことに注意してください。 javascriptエンジンに依存して、キー配列とob [e]ルックアップを必要とするオーバーヘッドは、空間の使用をO(n)に、潜在的にO(n log n)に複雑にします。

最新のJSエンジンをターゲットにしている場合は、手書き検索でMapオブジェクトを使用して、一定のスペースと線形時間の検索を行うことができます。

const getMax = function (map) { 
    let maxValue = null; 
    let maxKey = null; 

    map.forEach((value, key) => { 
     if (value.lottery.jackpotAmount > maxValue) { 
      maxValue = value.lottery.jackpotAmount; 
      maxKey = key; 
     } 
    }); 

    return maxKey; 
}; 

ここにはCodepen demoがあります。

乾杯

+1

いいアイデア。小さな修正 - '_.minBy()'を使う必要があります。なぜなら '_.min()'はコールバックを受け入れないからです。さらに、ユーザーが最も高い 'jackpotAmount'値(ソートは降順)を望むので、' _.maxBy() 'を使用してください。 –

+0

'_.max()'を使って動作します。 [ペンはこちら](https://codepen.io/anon/pen/gGxVyG?editors=0012) – Mowzer

+0

@OriDrori - ああ、申し訳ありませんが、良いキャッチ。私はアンダースコアmin()ではなく、lodash min()を考えていました。私は答えのコードを更新しました。 – James

関連する問題