Lodash获取唯一ID下具有最低值的项目

Ibr*_*med 4 javascript arrays lodash

我有一组代表一组旅行的对象,但同一次旅行有不同的价格,如下所示:

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}]
Run Code Online (Sandbox Code Playgroud)

因此,我想选择旅游 ID 可用的最低价格,并将其作为价格最低的独特旅游推送到新数组中。所以结果将是:

result = [{'id':1, price:200},
          {'id':3, price:120},
          {'id':2, price:100},]
Run Code Online (Sandbox Code Playgroud)

我在 Lodash 中尝试过类似的方法,_.minBy()但它从所有数组中返回一个。

Ori*_*ori 5

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);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

VanillaJS 解决方案

将 减少tours以id 为键的Map。在每次迭代中,选择价格最低的组。完成后,将返回传播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);
Run Code Online (Sandbox Code Playgroud)