首页 > 解决方案 > 如何在 lodash 中实现这一点

问题描述

我有看起来像这样的数组:

var arr = [
{user: 50, id: 70, time: '14:30'}, // ignore this user 50
{user: 70 id: 50, time: '14:50'}, // output this time is higher id 50
{user: 83, id: 50, time: '18:30'}
];

我想要的结果是按时间从数组中获取唯一的用户或 id 对象:

var result = [
{user: 83, id: 50, time: 18:30},
{user: 70, id: 50, time: 14:50}
];

或者

var arr = [
    {user: 70, id: 50, time: '14:30'}, // ignores this // id 50
    {user: 50 id: 70, time: '14:50'}, // output this // user 50
    {user: 83, id: 50, time: '18:30'}
    ];

那么结果应该会降低

var result = [
    {user: 83, id: 50, time: 18:30},
    {user: 50, id: 70, time: 14:50}
    ];

进一步解释我想要什么。假设 obj1 用户为 50,id 为 70,我们也有 obj2 用户 70 和 id 50,只要数组中有另一个对象共享 user <> id - id <> user 从它们中删除最近的时间值。

标签: javascriptlodash

解决方案


您可以使用lodash#orderBy降序排序时间,以确保我们按最高时间顺序唯一地删除相同的user和每个项目。id最后,我们lodash#uniqWith用来进行比较。

var result = _(arr)
  .orderBy('time', 'desc')
  .uniqWith((v1, v2) => v1.id === v2.user && v1.user === v2.id)
  .value();

// First data set
var arr = [
  {user: 50, id: 70, time: '14:30'}, // ignore this user 50
  {user: 70, id: 50, time: '14:50'}, // output this time is higher id 50
  {user: 83, id: 50, time: '18:30'}
];

var result = _(arr)
  .orderBy('time', 'desc')
  .uniqWith((v1, v2) => v1.id === v2.user && v1.user === v2.id)
  .value();
  
console.log('First data set');
console.log(result);

// Second data set
arr = [
  {user: 70, id: 50, time: '14:30'}, // ignores this // id 50
  {user: 50, id: 70, time: '14:50'}, // output this // user 50
  {user: 83, id: 50, time: '18:30'}
];

result = _(arr)
  .orderBy('time', 'desc')
  .uniqWith((v1, v2) => v1.id === v2.user && v1.user === v2.id)
  .value();
  
console.log('Second data set');
console.log(result);
.as-console-wrapper{min-height: 100%;top: 0;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>


推荐阅读