我在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'
}];
答案 0 :(得分:1)
您可以为同一type_id
取Map
并收集对象,然后根据数组的长度将映射的项目推送到唯一或欺骗。
该行
map.forEach(a => [unique, dupes][a.length - 1 && 1].push(...a));
获取地图并迭代其所有元素,并使用unique
和dupes
的目标数组,
[unique, dupes] // targets
获取maped数组的长度,用于分离目标数组
[a.length - 1 && 1] // select target
Cosider此列表用于获取索引,0
表示唯一项目,1
表示重复项目。零长度不存在,因为如果制作了地图条目,则长度为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
然后使用spread syntax ...
,数组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; }
答案 1 :(得分: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/
希望这有帮助! :)
最好的问候