2017-11-20 17 views
0

私は製品(オブジェクト)の配列を持っています。私はできるだけ少ない金額(この場合は$ 50)で最大限のBaseを獲得することで、あなたの利益を最大にすることを望んでいます。以下のデータセットの場合、正しい結果にはfoobarbazの配列が含まれます。入れ子オブジェクトの値に基づいてオブジェクトの配列を集める

"result": [ 
    { 
    "name": "foo", 
    "price": 20, 
    "Base": 52, 
    }, 
    { 
    "name": "bar", 
    "price": 12, 
    "Base": 51, 
    }, 
    { 
    "name": "baz", 
    "price": 15, 
    "Base": 50, 
    }, 
    { 
    "name": "qux", 
    "price": 10, 
    "Base": 47, 
    }, 
] 

もともと私は[]の初期アキュムレータと減速機を使用するだろうと思ったが、私は持っている私の製品はどこかの間に600個の範囲であることができる - 2000年の製品を、私はそれが

をperformant.ieされるだろうとは思いません

私は必要とは思わないときに2つの配列を追跡しているので、私はこのコードが嫌いです。私が見る限り、上記の出力は正しいですが、私の実装を改善できるかどうかは不思議です。ありがとう!

+1

[ナップザック問題](https://en.wikipedia.org/wiki/Knapsack_problem)のように見えます。 –

+0

まさに!ここには[great video](https://www.youtube.com/watch?v=8LusJS5-AGo)もあります。 – Zevgon

+0

多くのjsソリューションがあります:https://gist.github.com/frobnitzem/28707410b81870e88925097fdfe1f85b –

答えて

0

あなたが本当にやりたいことは、価格表を把握しているようです。それでは、forEachループをreduceに変換して、accumulatorをpriceListにするのはなぜですか?累積値に加算したい場合は内部で選択し、内部減算を取り除くことができます。

function selectProducts(results){ 
    let finalList = [] 
    results.reduce(function(acc, product){ 
    if (product.price + acc <= 50){ 
     finalList.push(product); 
     return acc + product.price; 
    } else { 
     return acc; 
    } 
    }, 0) 
    return finalList 
} 
+0

これは、元の質問のコードと同様に、このような配列に間違った結果をもたらすでしょうか? '{{価格":45、 "ベース":1}、{"価格":5、 "ベース":2}、{"価格":50、 "ベース":200} " – Zevgon

+0

私は同意しますknacksackの問題(https://en.wikipedia.org/wiki/Knapsack_problem)のように聞こえます。私は彼が提案した機能の複雑さに関するものでした。 –

関連する問題