Javascript 按对象属性的总和对对象数组进行排序

Javascript 按对象属性的总和对对象数组进行排序,javascript,Javascript,我的数组看起来像这样 [ { ... "code": "X", "pricings": [ { "price": 51, ... }, { "price": 51, ... } ] }, { ... "code": "Y", "pricings": [ {

我的数组看起来像这样

[
  {
    ...
    "code": "X",
    "pricings": [
       {
          "price": 51,
          ...
       },
       {
          "price": 51,
          ...
       }
     ]
   },
   {
     ...
     "code": "Y",
     "pricings": [
       {
         "price": 88,
         ...
       },
       {
         "price": 88,
         ...
       }
    ]
  },
  ...
]
我需要根据
price
属性(降序)的总和对其进行排序。因此,在本例中,代码为“Y”的产品应位于第一个位置

我现在这样做

arr.sort((a, b) => b.pricings.map(el => el.price).reduce((prev, curr) => { return prev + curr }) - a.pricings.map(el => el.price).reduce((prev, curr) => { return prev + curr }))

但我不太确定这是否是一个好方法,我很好奇是否有一个更简单/更好的解决方案来实现这一结果。也许您可以分享一些经验:)

无需首先映射它,只需按缩减排序即可:

arr.sort((a, b) => {
  const sumA = a.pricings.reduce((sum, entry) => sum + entry.price, 0);
  const sumB = b.pricings.reduce((sum, entry) => sum + entry.price, 0);
  return sumA - sumB;
});

你甚至可以考虑将数组预处理成一个新的条目,其中每个条目是一个具有预先计算的总和的对象和对原始的引用,然后映射它;应通过在排序过程中不多次调用reduce来提高性能:

const mapped = arr.map(entry => {
  const sumEntry = entry.pricings.reduce((sum, pricing) => sum + pricing.price, 0);
  return {
    entry,
    sum: sumEntry

  }
});
mapped.sort((a, b) => a.sum - b.sum).map(value => value.entry);

您的解决方案很好,但您可以跳过
.map()
,并预先存储reducer函数

const sumPrice = (acc,val) => acc + val.price;
arr.sort((a, b) => b.pricings.reduce(sumPrice,0) - a.pricings.reduce(sumPrice,0))

您可以获得一个包含项和的数组,并对一个包含相同索引和的索引数组进行排序,然后按所需顺序映射一个新数组

这种方法的优点是对每个对象进行单循环
定价

var数组=[{code:X],pricings:[{price:51},{price:51}},{code:Y],pricings:[{price:88},{price:88}]},{pricings:[{price:7},{price:42},{price:33}]},
sums=array.map(({pricings})=>pricings.reduce((s,{price})=>s+price,0)),
结果=[…sums.keys()]
.sort((a,b)=>和[b]-和[a])
.map(i=>array[i]);
控制台日志(结果)

。由于控制台包装器{max height:100%!important;top:0;}
是一个很好的此类网站:)谢谢@SpaceCowboy,我将尝试下一个此类问题:)我不知道你可以在
地图中这样使用
{}
-函数:D感谢这个伟大的解决方案@Nina Scholz。这是一个很好的解决方案。