假设我有以下对象数组
var firstDataSet = [
{'id': 123, 'name': 'ABC'},
{'id': 456, 'name': 'DEF'},
{'id': 789, 'name': 'GHI'},
{'id': 101, 'name': 'JKL'}
];
var secondDataSet = [
{'id': 123, 'name': 'ABC', 'xProp': '1q'},
{'id': 156, 'name': 'MNO', 'xProp': '2w'},
{'id': 789, 'name': 'GHI', 'xProp': '3e'},
{'id': 111, 'name': 'PQR', 'xProp': '4r'}
];现在我想收集具有唯一对象的数组(匹配id和name),即
var firstDataSet = [
{'id': 123, 'name': 'ABC', 'xProp': '1q'},
{'id': 456, 'name': 'DEF'},
{'id': 789, 'name': 'GHI', 'xProp': '3e'},
{'id': 101, 'name': 'JKL'},
{'id': 156, 'name': 'MNO', 'xProp': '2w'},
{'id': 111, 'name': 'PQR', 'xProp': '4r'}
];我可以收集所有的
Array.prototype.unshift.apply(firstDataSet , secondDataSet );但不知道我怎么过滤掉重复的。有什么建议吗?
编辑:我的对象在两个不同的数组上是不一样的。至少基于属性的数量。
发布于 2016-03-31 22:37:50
删除具有所有相同属性的重复项
这是最初的问题。
使用Set
Set对象允许存储任何类型的唯一值,无论是原始值还是对象引用。
还可以使用对象文本。
var list = [JSON.stringify({id: 123, 'name': 'ABC'}), JSON.stringify({id: 123, 'name': 'ABC'})];
var unique_list = new Set(list); // returns Set {"{'id': 123, 'name': 'ABC'}"}
var list = Array.from(unique_list); // converts back to an array, and you can unstringify the results accordingly.有关将集合构造回数组的更多方法,可以按照这里指令进行操作。如果您不能使用ES6 (这就是定义Set的方法),那么就会为旧的浏览器提供聚脂填充。
删除具有属性的重复子集的对象
不幸的是,这些对象不再是严格重复的,不能以友好的方式使用Set来处理。
解决这类问题的最简单方法是迭代对象数组,识别具有重复属性值的对象,并使用splice消除这些问题。
发布于 2019-12-10 05:10:43
这可以通过像下面这样扩展Set类来实现
var firstDataSet = [
{'id': 123, 'name': 'ABC'},
{'id': 456, 'name': 'DEF'},
{'id': 789, 'name': 'GHI'},
{'id': 101, 'name': 'JKL'}
];
var secondDataSet = [
{'id': 123, 'name': 'ABC', 'xProp': '1q'},
{'id': 156, 'name': 'MNO', 'xProp': '2w'},
{'id': 789, 'name': 'GHI', 'xProp': '3e'},
{'id': 111, 'name': 'PQR', 'xProp': '4r'}
];
Array.prototype.unshift.apply(firstDataSet , secondDataSet );
//console.log(firstDataSet)
class UniqueSet extends Set {
constructor(values) {
super(values);
const data = [];
for (let value of this) {
if (data.includes(JSON.parse(value.id))) {
this.delete(value);
} else {
data.push(value.id);
}
}
}
}
console.log(new UniqueSet(firstDataSet))工作链接
发布于 2016-04-01 02:33:06
这可能不是最有效的解决方案,但假设id总是唯一的,它应该可以工作。
var firstDataSet = [
{'id': 123, 'name': 'ABC'},
{'id': 456, 'name': 'DEF'},
{'id': 789, 'name': 'GHI'},
{'id': 101, 'name': 'JKL'}
];
var secondDataSet = [
{'id': 123, 'name': 'ABC', 'xProp': '1q'},
{'id': 156, 'name': 'MNO', 'xProp': '2w'},
{'id': 789, 'name': 'GHI', 'xProp': '3e'},
{'id': 111, 'name': 'PQR', 'xProp': '4r'}
];
Array.prototype.unique = function() {
var o = {}, i, l = this.length, r = [];
for(i=0; i<l;i+=1) o[this[i]] = this[i];
for(i in o) r.push(o[i]);
return r;
};
function concatUnique(a, b, property) {
var arr = a.concat(b);
arr.sort(function(a,b) {
return Object.keys(b).length - Object.keys(a).length;
});
var ids = arr.map(function(obj){ return obj[property] }).unique();
return arr.filter(function(obj) {
if(ids.indexOf(obj[property]) > -1) {
ids.splice( ids.indexOf(obj[property]) , 1);
return true;
} else {
return false
}
});
}
var newArray = concatUnique(firstDataSet, secondDataSet, 'id');https://stackoverflow.com/questions/36344976
复制相似问题