javascript - lodash - 基于多个属性创建唯一列表
javascript - lodash - create a unique list based on multiple attributes
我的 collection 看起来像这样。
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 和序列的 object 只会 return object 之一(我们这里有 2 个 - {id: '12349', sequence:1})
我的代码
var uniqueList = _.uniq(list, function(obj) {
return obj.id && obj.sequence;
});
我们可以这样使用 lodash uniq 吗?解决此问题的方法是什么?
No.Use uniqWith. And write correct comparator with same signature as isEqual.
您可以使用uniqWith
This method is like _.uniq except that it accepts comparator which is invoked to compare elements of array. The comparator is invoked with two arguments: (arrVal, othVal).
Performs a deep comparison between two values to determine if they are equivalent.
_.uniqWith(list, _.isEqual);
您可以使用 uniqBy() 来计算生成列表的标准,其中迭代器回调 returns 每个项目的 id
和 sequence
的联合值的集合。当您只想将特定属性作为唯一性标准时,尤其是当您集合中的每个对象可能不仅具有 id
和 sequence
属性时,下面的解决方案非常有效。
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>
我的 collection 看起来像这样。
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 和序列的 object 只会 return object 之一(我们这里有 2 个 - {id: '12349', sequence:1})
我的代码
var uniqueList = _.uniq(list, function(obj) {
return obj.id && obj.sequence;
});
我们可以这样使用 lodash uniq 吗?解决此问题的方法是什么?
No.Use uniqWith. And write correct comparator with same signature as isEqual.
您可以使用uniqWith
This method is like _.uniq except that it accepts comparator which is invoked to compare elements of array. The comparator is invoked with two arguments: (arrVal, othVal).
Performs a deep comparison between two values to determine if they are equivalent.
_.uniqWith(list, _.isEqual);
您可以使用 uniqBy() 来计算生成列表的标准,其中迭代器回调 returns 每个项目的 id
和 sequence
的联合值的集合。当您只想将特定属性作为唯一性标准时,尤其是当您集合中的每个对象可能不仅具有 id
和 sequence
属性时,下面的解决方案非常有效。
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>