gpt4 book ai didi

javascript - lodash - 基于多个属性创建唯一列表

转载 作者:可可西里 更新时间:2023-11-01 02:52:13 26 4
gpt4 key购买 nike

我的收藏看起来像这样。

  var list = [{id:'12345', sequence:null}, {id:'12346', sequence:null}, {id:'12347', sequence:null}, {id:'12348', sequence:1}, {id:'12348', sequence:2}, {id:'12349', sequence:1}, {id:'12349', sequence:1}];

我正在尝试获取一个唯一列表,以便具有相同 ID 和序列的对象将只返回其中一个对象(我们这里有 2 个 - {id:'12349', sequence:1})

我的代码

  var uniqueList = _.uniq(list, function(obj) {
return obj.id && obj.sequence;
});

我们可以像这样使用 lodash uniq 吗?解决此问题的方法是什么?

最佳答案

您可以使用 uniqBy()计算生成列表的标准,其中 iteratee 回调返回集合中每个项目的 idsequence 的联合值。当您只想将特定属性作为唯一性标准时,尤其是当您集合中的每个对象可能不仅具有 idsequence 属性时,下面的解决方案非常有效。

var result = _.uniqBy(list, v => [v.id, v.sequence].join());

var list = [{
id: '12345',
sequence: null
}, {
id: '12346',
sequence: null
}, {
id: '12347',
sequence: null
}, {
id: '12348',
sequence: 1
}, {
id: '12348',
sequence: 2
}, {
id: '12349',
sequence: 1
}, {
id: '12349',
sequence: 1
}, {
id: '123490',
sequence: 1,
extra: 1
}, {
id: '123490',
sequence: 1,
extra: 2
}];

var result = _(list)
.uniqBy(v => [v.id, v.sequence].join())
.value();

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.js"></script>

或者,如果您的属性包含要用作标准的非原始值(对象或数组),那么您仍然可以使用上述解决方案,但要加入值数组,您必须使用 JSON.stringify()

var result = _.uniqBy(list, v => JSON.stringify([v.id, v.sequence]));

var list = [{
id: '12345',
sequence: null
}, {
id: '12346',
sequence: null
}, {
id: '12347',
sequence: null
}, {
id: '12348',
sequence: 1
}, {
id: '12348',
sequence: 2
}, {
id: '12349',
sequence: 1
}, {
id: '12349',
sequence: 1
}, {
id: '123490',
sequence: 1,
extra: 1
}, {
id: '123490',
sequence: 1,
extra: 2
}];

var result = _.uniqBy(list, v => JSON.stringify([v.id, v.sequence]));

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.js"></script>

更新:

对于 lodash3 解决方案,对于具有原始值的属性,您仍然可以使用第一个解决方案中的模式使用 uniq() .

var result = _.uniq(list, v => [v.id, v.sequence].join());

var list = [{
id: '12345',
sequence: null
}, {
id: '12346',
sequence: null
}, {
id: '12347',
sequence: null
}, {
id: '12348',
sequence: 1
}, {
id: '12348',
sequence: 2
}, {
id: '12349',
sequence: 1
}, {
id: '12349',
sequence: 1
}, {
id: '123490',
sequence: 1,
extra: 1
}, {
id: '123490',
sequence: 1,
extra: 2
}];

var result = _.uniq(list, v => [v.id, v.sequence].join());

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>

对于非原始属性,您仍然可以将上面的第二个示例与 uniq() 一起使用

var result = _.uniq(list, v => JSON.stringify([v.id, v.sequence]));

var list = [{
id: '12345',
sequence: null
}, {
id: '12346',
sequence: null
}, {
id: '12347',
sequence: null
}, {
id: '12348',
sequence: 1
}, {
id: '12348',
sequence: 2
}, {
id: '12349',
sequence: 1
}, {
id: '12349',
sequence: 1
}, {
id: '123490',
sequence: 1,
extra: 1
}, {
id: '123490',
sequence: 1,
extra: 2
}];

var result = _.uniq(list, v => JSON.stringify([v.id, v.sequence]));

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>

关于javascript - lodash - 基于多个属性创建唯一列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37316181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com