什么';消除JavaScript列表中重复项的最佳方法是什么?

什么';消除JavaScript列表中重复项的最佳方法是什么?,javascript,ecmascript-6,Javascript,Ecmascript 6,我编写了两个方法将项添加到数组中,如果它们已经在数组中,它们将被忽略。在对数据结构做了一些研究之后,我意识到我可以通过简单地将它们放在一个集合中来消除重复项(特别是因为我不关心对象的顺序)。但是,在使用JavaScript之后,我注意到相同的对象被添加到一个集合中,例如: var mySet = new Set(); mySet.add({a:23}) console.log(mySet); mySet.add({b:14}) console.log(mySet); mySet.add({a:2

我编写了两个方法将项添加到数组中,如果它们已经在数组中,它们将被忽略。在对数据结构做了一些研究之后,我意识到我可以通过简单地将它们放在一个集合中来消除重复项(特别是因为我不关心对象的顺序)。但是,在使用JavaScript之后,我注意到相同的对象被添加到一个集合中,例如:

var mySet = new Set();
mySet.add({a:23})
console.log(mySet);
mySet.add({b:14})
console.log(mySet);
mySet.add({a:23})
console.log(mySet);
输出:

Set {Object {a: 23}}
Set {Object {a: 23}, Object {b: 14}}
Set {Object {a: 23}, Object {b: 14}, Object {a: 23}}
在本例中,我添加了带有key->a和value->23的对象,然后是另一个具有完全不同的key、value集的对象,然后是原始对象。我希望我的集合中只有a->23和b->14


消除列表中重复项的最佳方法是什么?

这些对象虽然具有相同的结构,但却是不同的。每个表示内存中的一个单独空间,并且是对该内存的唯一引用

console.log(
{a:23}==={a:23}//false

);这些对象虽然具有相同的结构,但却是不同的。每个表示内存中的一个单独空间,并且是对该内存的唯一引用

console.log(
{a:23}==={a:23}//false

);正如其他人所说,对象不相等,因此它们看起来是重复的。如果您可以指定一个键,我假设它是a、b、c等等,那么您可以使用映射。这也很难接受

var myMap = new Map();
myMap.set('a',23);
myMap.set('b',123);
myMap.set('a',33);

console.log(myMap)

映射{“a”=>33,“b”=>123}(2)

正如其他人所说,对象是不相等的,因此它们看起来是重复的。如果您可以指定一个键,我假设它是a、b、c等等,那么您可以使用映射。这也很难接受

var myMap = new Map();
myMap.set('a',23);
myMap.set('b',123);
myMap.set('a',33);

console.log(myMap)


映射{“a”=>33,“b”=>123}(2)

简单的例子,在控制台中键入
{a:23}=={a:23}
。我喜欢使用
JSON.stringify()
作为“关联数组”中的键,但我不确定这是否是“最佳”方式。这是你的问题,你认为它们是“相同的对象”,但事实上,它们是指向不同对象的不同引用。在回答如何删除重复项的问题之前,您首先必须定义“重复”的含义。具有相同属性集的对象?那么具有相同属性集但具有不同原型的对象呢?它们是“复制品”吗?相关吗?关键是它们不完全相同,即具有相同的身份。它们可能看起来相等,并且具有相同的属性值,但它们是不同的对象。简单的示例是,在控制台中键入
{a:23}=={a:23}
。我喜欢使用
JSON.stringify()
作为“关联数组”中的键,但我不确定这是否是“最佳”方式。这是您的问题,您认为它们是“相同的对象”,但事实上,它们是指向不同对象的不同引用。在回答如何删除重复项的问题之前,您首先必须定义“重复”的含义。具有相同属性集的对象?那么具有相同属性集但具有不同原型的对象呢?它们是“复制品”吗?相关吗?关键是它们不完全相同,即具有相同的身份。它们可能看起来相等,并且具有相同的属性值,但它们是不同的对象。如果它们的键是字符串,则实际上不需要
映射。你可以用一个标准对象来代替。是的,你可以,map稍微有用一点,因为它是可编辑的,OP提到了数组,但这两种方法对我都适用。如果它们的键是字符串,那么就不需要
map
。你可以用一个标准的对象来代替。是的,你可以,map稍微有用一点,因为它是可编辑的,OP提到了数组,但这两种方法都适用于我。@Bergi不确定。如果他们至少对他们认为错误的东西给出反馈,这会很有用。谢谢@nem035,如果有人不得不使用集合,你的答案会很完美,但为了简单起见,我认为地图对我的应用更有意义。也不知道为什么会有人否决你的答案。我已经取消了我的否决票。第一版刚刚回答了时间复杂性问题。@MehulMohan谢谢。顺便说一句,我最后增加了时间复杂性:)。刚才提到的
==
比较是通过引用,而不是通过结构,OP应该使用类似于深度相等比较的东西。@Bergi不确定。如果他们至少对他们认为错误的东西给出反馈,这会很有用。谢谢@nem035,如果有人不得不使用集合,你的答案会很完美,但为了简单起见,我认为地图对我的应用更有意义。也不知道为什么会有人否决你的答案。我已经取消了我的否决票。第一版刚刚回答了时间复杂性问题。@MehulMohan谢谢。顺便说一句,我最后增加了时间复杂性:)。刚才提到的
==
比较是通过引用,而不是通过结构,OP应该使用类似于深度相等比较的东西。