javascript - 如何在 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 从它们中删除最近的时间值。
解决方案
您可以使用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>