如何在JavaScript中从Set中删除一个对象

5
我很乐意协助你解决如何在JavaScript中从Set中删除特定对象的问题。我在网上没有找到这个看似简单的问题的答案。 请参考以下简单的Set示例:
let mySet = new Set([1, 2, {Name: "Ann"}]);

Set(3) {1, 2, {…}}



mySet.delete(1);  

console.log(mySet);

Set(2) {2, {…}}

// 基本语法似乎无法从Set中删除对象。我尝试了以下操作,但没有一个能够移除该对象:

mySet.delete({"Name": "Ann"});
false

mySet.delete("Name");
false

mySet.delete("Ann");
false

是否有一种不同的方法可以从JavaScript的集合(Set)中移除特定的对象?也许使用for...of循环,但如何指定要移除的特定对象呢? 任何帮助都将不胜感激。 :)


2
你需要一个指向特定对象的引用,而不是一个具有相等值的新对象。 - Bergi
1
使用例如forEach的Set迭代,并找到删除值的引用。然后删除该引用。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set/delete - Ivan Burnaev
感谢Bergi和Ivan的热心回复和分享知识。我非常感激! :) - Chess
3个回答

8

Set对象使您能够存储任何类型的唯一值,包括原始值或对象引用

因此,由于它们没有相同的对象引用,这将仅向Set添加2个对象。

var mySet = new Set([{Name: "Ann"}, {Name: "Ann"}]);

console.log(mySet.size) // 2

在这种情况下,您可以使用一个数组。
因此,在这种情况下,要删除 Ann(因为我们没有对象引用),我们需要:

var mySet = new Set([1, 2, "abc", {Name: "Ann"}]);

console.log('With Ann size:', mySet.size)

mySet.forEach(x => x.Name === 'Ann' ? mySet.delete(x) : x)

console.log('Bye Ann size:', mySet.size)

现在考虑以下内容:

var ann = {Name: 'Ann'}
var mySet = new Set([ann, ann])

console.log('With Ann size:', mySet.size)

mySet.delete(ann)

console.log('Bye Ann size:', mySet.size)

正如您所见,我们现在正在处理对象引用,首先大小仅为 1,Set 现在可以找到 ann引用并且没有问题地将其移除。


谢谢你,Akrion。我非常感激你的指导。我喜欢使用Set内置的forEach方法来遍历Set。 :) - Chess

2

如果你能在将对象传递给Set之前初始化它,并保留对它的引用(即作用域);

const person = { name: "Ann" };
const my_set = new Set([1, 2, person]);
my_set.has(person); //true
my_set.delete(person);
my_set.has(person); // false

否则;
const my_set = new Set([1, 2, { name: "Ann" }]);
my_set.forEach(item => { if (item.name === "Ann") my_set.delete(item); });

你好,Mudlabs,感谢你们的解决方案。正如我之前向Akrion表达的那样,现在使用Set内置的forEach方法对我来说非常有意义。但是,如果可能的话,在将对象传递给Set之前初始化它也非常有价值。在这种情况下,似乎更加简单明了。谢谢! :) - Chess

1
我通常做的是:
  1. 将Set转换为Array
  2. 使用字符串化比较过滤对象*
  3. 将Array转换回Set

* 注意,这考虑了键的顺序。

您可以使用此函数:

function removeObjectFromSet (set, obj) {
    return new Set([...set].filter((el) => JSON.stringify(el) != JSON.stringify(obj)))
}

例如,像这样:

例如,像这样:

let mySet = new Set([1, 2, { Name: "Ann" }])

mySet = removeObjectFromSet(mySet, { Name: "Ann" })
console.log(mySet)

嗨Naranjja,非常感谢您的回复和分享解决方案。我喜欢在将Set转换为Array并在之后再将其转换回Set后,所有的Array方法都可以使用。在收到各种解决方案后,我意识到了理解每个提供的解决方案的重要性,但我很好奇上述推荐方法中哪个执行任务最有效。非常感谢! :) - Chess

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接