我有一系列产品(对象)。我希望通过尽可能少的钱获得最多的Base(在这种情况下,50美元)来获得最大的收益。对于下面的数据集,正确的结果将包含一系列foo
bar
和baz
个产品。
"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
function selectProducts(results){
let finalList = []
let priceList = []
results.forEach(function(product){
let price = product.price
let sum = priceList.reduce(function(accumulator, currentValue) {
return accumulator + currentValue;
}, 0);
if (product.price + sum <= 50){
finalList.push(product);
priceList.push(price);
}
})
return finalList
}
我不喜欢这段代码,因为当我认为不需要时,我会跟踪两个数组。据我所知,上面的输出是正确的,但我很想知道我的实现是否可以改进。感谢!!!
答案 0 :(得分:0)
您真正想要做的就是跟踪priceList。那么为什么不将forEach循环转换为reduce,然后累加器可以是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
}