根据嵌套对象值收集对象数组

时间:2017-11-20 07:42:18

标签: javascript arrays sorting ecmascript-6

我有一系列产品(对象)。我希望通过尽可能少的钱获得最多的Base(在这种情况下,50美元)来获得最大的收益。对于下面的数据集,正确的结果将包含一系列foo barbaz个产品。

 "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
}

我不喜欢这段代码,因为当我认为不需要时,我会跟踪两个数组。据我所知,上面的输出是正确的,但我很想知道我的实现是否可以改进。感谢!!!

1 个答案:

答案 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
}