我有一个表示一组旅游的对象数组,但是相同的旅游有不同的价格,如下所示:
let tours = [{'id':1, price:200},
{'id':1, price:300},
{'id':3, price:150},
{'id':2, price:110},
{'id':3, price:120},
{'id':2, price:100}]因此,我想选择旅游ID提供的最低价格,并将其作为唯一的最低价格推入一个新的数组中。因此,结果将是:
result = [{'id':1, price:200},
{'id':3, price:120},
{'id':2, price:100},]我尝试了Lodash中的方法,比如_.minBy(),但是它从所有数组中返回一个方法。
发布于 2018-03-31 09:09:56
Lodash溶液
您可以_.groupBy() ids,而不是_.map()的结果,并采取最低的每一组与_.minBy()
const tours = [{"id":1,"price":200, prop: 'prop1' },{"id":1,"price":300, prop: 'prop1'},{"id":3,"price":150},{"id":2,"price":110},{"id":3,"price":120},{"id":2,"price":100}];
const result = _(tours)
.groupBy('id')
.map((group) => _.minBy(group, 'price'))
.value();
console.log(result);<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
VanillaJS解决方案
Reduce tours到一个以ids作为键的地图。在每一次迭代中,使用最低价格的组。完成后,将铺展 Map.values()返回到一个数组:
const tours = [{"id":1,"price":200, prop: 'prop1' },{"id":1,"price":300, prop: 'prop1'},{"id":3,"price":150},{"id":2,"price":110},{"id":3,"price":120},{"id":2,"price":100}];
const lowest = [...tours.reduce((r, o) => {
const { id, price } = o;
const current = r.get(id);
if(!current || price < current.price) r.set(id, { ...o });
return r;
}, new Map()).values()];
console.log(lowest);
发布于 2018-03-31 09:22:03
或者您可以简单地使用reduce和,继续更新累加器中的最小值。
tours.reduce( (acc, c) => {
acc[c.id] = acc[c.id] ? Math.min( c.price, acc[c.id] ) : c.price; //update min value in accumulator
return acc; // return accumulator
} ,{}) //initialize accumulator to {}Demo
let tours = [{
'id': 1,
price: 200
},
{
'id': 1,
price: 300
},
{
'id': 3,
price: 150
},
{
'id': 2,
price: 110
},
{
'id': 3,
price: 120
},
{
'id': 2,
price: 100
}
];
var output = tours.reduce((acc, c) => {
acc[c.id] = acc[c.id] ? Math.min(c.price, acc[c.id]) : c.price;
return acc;
}, {});
console.log(output);
https://stackoverflow.com/questions/49586087
复制相似问题