[英]javascript array filter duplicates by object key
我在 Javascript 中有一个对象数组
我正在尝试按对象值过滤掉重复项
得到重复
变得独一无二
示例数组:
let array = [
{
id: '001',
name: 'aaa',
type_id: 'a111'
},{
id: '002',
name: 'bbb',
type_id: 'a111'
},{
id: '003',
name: 'ccc',
type_id: 'a222'
},{
id: '004',
name: 'ddd',
type_id: 'a333'
}];
这就是我希望我的数组变成这样的:
function 1(array, 'type_id')
[{
id: '001',
name: 'aaa',
type_id: 'a111'
},{
id: '002',
name: 'bbb',
type_id: 'a111'
}];
function 2(array, 'type_id')
[{
id: '003',
name: 'ccc',
type_id: 'a222'
},{
id: '004',
name: 'ddd',
type_id: 'a333'
}];
您可以为相同的type_id
获取一个Map
并收集对象,然后根据数组的长度将映射的项目推送到 unique 或 dupes。
线
map.forEach(a => [unique, dupes][a.length - 1 && 1].push(...a));
获取地图并迭代它的所有元素并使用unique
和dupes
的目标数组,
[unique, dupes] // targets
获取映射数组的长度,用于分离目标数组
[a.length - 1 && 1] // select target
考虑此列表以获取索引, 0
表示唯一项目, 1
表示重复项目。 零长度不存在,因为如果创建映射条目,则长度为一。
length length - 1 length - 1 && 1 comment ------ ---------- --------------- -------- 1 0 0 take `length - 1`, because of falsy 1st operand 2 1 1 take 2nd operand 3 2 1 take 2nd operand 4 3 1 take 2nd operand for all other greater length
然后使用扩展语法...
,数组a
所有项目都用作Array#push
参数。
.push(...a) // push all itmes of array
var array = [{ id: '001', name: 'aaa', type_id: 'a111' }, { id: '002', name: 'bbb', type_id: 'a111' }, { id: '003', name: 'ccc', type_id: 'a222' }, { id: '004', name: 'ddd', type_id: 'a333' }], key = 'type_id', map = new Map, unique = [], dupes = []; array.forEach(o => map.set(o[key], (map.get(o[key]) || []).concat(o))); map.forEach(a => [unique, dupes][a.length - 1 && 1].push(...a)); console.log(unique); console.log(dupes);
.as-console-wrapper { max-height: 100% !important; top: 0; }
我已经编写了一些代码来完成您想要实现的那些事情:
let array = [{
id: '001',
name: 'aaa',
type_id: 'a111'
}, {
id: '002',
name: 'bbb',
type_id: 'a111'
}, {
id: '003',
name: 'ccc',
type_id: 'a222'
}, {
id: '004',
name: 'ddd',
type_id: 'a333'
}];
var duplicates = [];
var uniques = [];
var valueCounts = {};
function getDuplicatesAndUniques(array, value) {
for (var i = 0; i < array.length; i++) {
if (!valueCounts[array[i][value]])
valueCounts[array[i][value]] = 1;
else
valueCounts[array[i][value]]++;
}
for (var i = 0; i < array.length; i++) {
if (valueCounts[array[i][value]] == 1) {
uniques.push(array[i]);
} else {
duplicates.push(array[i]);
}
}
}
getDuplicatesAndUniques(array, "type_id");
console.log(duplicates);
console.log(uniques);
https://jsfiddle.net/hbpx08xh/1/
希望这可以帮助! :)
此致
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.