Javascript |集合中唯一的对象

Javascript |集合中唯一的对象,javascript,Javascript,如何防止集合对象被重复对象填充 [ { prop1: [{value: "val", disabled: true}] (1) prop2: [{value: [4, 5], disabled: true}] (1) prop3: [{value: "someOtherValue", disabled: true}] (1) }, { prop1: [{value: "val", disable

如何防止
集合
对象被重复对象填充

  [    
    {
        prop1: [{value: "val", disabled: true}] (1)
        prop2: [{value: [4, 5], disabled: true}] (1)
        prop3: [{value: "someOtherValue", disabled: true}] (1)
    },

    {
        prop1: [{value: "val", disabled: true}] (1)
        prop2: [{value: [4, 5], disabled: true}] (1)
        prop3: [{value: "someOtherValue", disabled: true}] (1)
    },
    {
        prop1: [{value: "otherValue", disabled: true}] (1)
        prop2: [{value: [3], disabled: true}] (1)
        prop3: [{value: "", disabled: true}] (1)
    },
  ]
因此,在数组中循环时,我检查Set对象是否包含重复项,但即使它包含重复项,check始终返回false

let s = new Set();

//for loop starts here

let check = s.has(obj) // false

if(check == false){
    s.add(obj);
}

对象是通过引用传递的,这意味着当您将它们添加到集合中时,即使它们完全相同,如果您使用
==
检查它们,它们也不会相同

var a = {val1: 'hello', val2: 'there'}
var b = {val1: 'hello', val2: 'there'}
console.log(a === b) // false
console.log(a == b)  // false
要解决这个问题,您可以编写如下内容,摘自

var a={val1:'hello',val2:'there'};
var b={val1:'你好',val2:'那里'};
函数是等价的(a,b){
//创建属性名称数组
var aProps=Object.getOwnPropertyNames(a);
var bProps=Object.getOwnPropertyNames(b);
//如果属性的数量不同,
//对象不是等价的
如果(平均速度长度!=平均速度长度){
返回false;
}
对于(变量i=0;iconsole.log(相当于(a,b));//true
对象通过引用传递,这意味着当您将它们添加到集合中时,即使它们完全相同,如果您使用
==
检查它们,它们也将不相同

var a = {val1: 'hello', val2: 'there'}
var b = {val1: 'hello', val2: 'there'}
console.log(a === b) // false
console.log(a == b)  // false
要解决这个问题,您可以编写如下内容,摘自

var a={val1:'hello',val2:'there'};
var b={val1:'你好',val2:'那里'};
函数是等价的(a,b){
//创建属性名称数组
var aProps=Object.getOwnPropertyNames(a);
var bProps=Object.getOwnPropertyNames(b);
//如果属性的数量不同,
//对象不是等价的
如果(平均速度长度!=平均速度长度){
返回false;
}
对于(变量i=0;i
也许比Ben的答案更简短——当然也更懒/更不推荐——的替代方法是使用JSON进行比较:

let s = new Set()

arr.forEach(obj => (
    !s.has(JSON.stringify(obj)) && s.add(JSON.stringify(obj))
))

s = new Set([...s].map(o => JSON.parse(o)))
值得一提的是,只有在键值对顺序相同的情况下,

这才起作用。与Ben的答案相比,使用JSON进行比较可能是一种更短、更懒、更不推荐的选择:

let s = new Set()

arr.forEach(obj => (
    !s.has(JSON.stringify(obj)) && s.add(JSON.stringify(obj))
))

s = new Set([...s].map(o => JSON.parse(o)))

值得一提的是,这仅在键值对的顺序相同时才起作用,这是因为对象具有不同的引用。它们根本不同(通过
===
进行比较)。您必须执行自己的检查algorithm@Li357即使对象具有
==
,它也将返回false,因为正如您所说的,它们具有不同的引用
=
&
==对于对象,如果两者都具有相同的引用,则只会返回
true
。这是因为对象具有不同的引用。它们根本不同(通过
===
进行比较)。您必须执行自己的检查algorithm@Li357即使对象具有
==
,它也将返回false,因为正如您所说的,它们具有不同的引用<如果对象的代码>=&
==
具有相同的引用,则仅返回
true