首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lodash获取在唯一id下具有最低值的项。

Lodash获取在唯一id下具有最低值的项。
EN

Stack Overflow用户
提问于 2018-03-31 09:03:50
回答 2查看 5.9K关注 0票数 5

我有一个表示一组旅游的对象数组,但是相同的旅游有不同的价格,如下所示:

代码语言:javascript
复制
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提供的最低价格,并将其作为唯一的最低价格推入一个新的数组中。因此,结果将是:

代码语言:javascript
复制
result = [{'id':1, price:200},
          {'id':3, price:120},
          {'id':2, price:100},]

我尝试了Lodash中的方法,比如_.minBy(),但是它从所有数组中返回一个方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-31 09:09:56

Lodash溶液

您可以_.groupBy() ids,而不是_.map()的结果,并采取最低的每一组与_.minBy()

代码语言:javascript
复制
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);
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

VanillaJS解决方案

Reduce tours到一个以ids作为键的地图。在每一次迭代中,使用最低价格的组。完成后,将铺展 Map.values()返回到一个数组:

代码语言:javascript
复制
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);

票数 6
EN

Stack Overflow用户

发布于 2018-03-31 09:22:03

或者您可以简单地使用reduce,继续更新累加器中的最小值。

代码语言:javascript
复制
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

代码语言:javascript
复制
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);

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49586087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档