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。这是一个很好的解决方案。