数组中包含数组,怎么去重?
比如数组:[[{a:1},{a:1,b:2}],[{a:1}],[{a:1},{a:1,b:2}]]
let arr = [[{a:1},{a:1,b:2}],[{a:1}],[{a:1},{a:1,b:2}]]
function getUnique(array){
let obj = {}
return array.filter((item, index) => {
// 防止key重复
let newItem = item + JSON.stringify(item)
return obj.hasOwnProperty(newItem) ? false : obj[newItem] = true
})
}
getUnique(arr)
hasOwnProperty()
方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是是否有指定的键),
所有继承了 Object
的对象都会继承到 hasOwnProperty
方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和 in
运算符不同,该方法会忽略掉那些从原型链上继承到的属性。
下面的例子检测了对象 o
是否含有自身属性 prop:
o = new Object();
o.prop = 'exists';
function changeO() {
o.newprop = o.prop;
delete o.prop;
}
o.hasOwnProperty('prop'); // 返回 true
changeO();
o.hasOwnProperty('prop'); // 返回 false
遍历一个对象的所有自身属性
下面的例子演示了如何在遍历一个对象的所有属性时忽略掉继承属性,注意这里 for...in
循环只会遍历可枚举属性,所以不应该基于这个循环中没有不可枚举的属性而得出 hasOwnProperty 是严格限制于可枚举项目的(如同
Object.getOwnPropertyNames()
)。
var buz = {
fog: 'stack'
};
for (var name in buz) {
if (buz.hasOwnProperty(name)) {
alert("this is fog (" + name + ") for sure. Value: " + buz[name]);
}
else {
alert(name); // toString or something else
}
}