如何从JavaScript中的Set中删除对象

时间:2018-10-04 05:52:44

标签: javascript set

对于在JavaScript中从集合中删除/删除特定对象的帮助,我将不胜感激。我无法在网上找到这个看似简单的问题的答案。 请参阅以下简单示例集:

<input value="1231" />
<input value="1231" />
<input value="aaa" />

//上面的基本语法似乎并未删除Set中的对象。我尝试了以下方法,但都没有删除对象:

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

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



mySet.delete(1);  

console.log(mySet);

Set(2) {2, {…}}

是否有其他方法可以从JavaScript中的Set中删除特定对象?也许是for ... of循环,但是如何指定要删除的特定对象呢? 任何帮助将不胜感激。 :)

3 个答案:

答案 0 :(得分:1)

  

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 引用并毫无问题地将其删除。

答案 1 :(得分:0)

我通常要做的是

  1. 将集合转换为数组
  2. 使用字符串化比较将对象过滤掉*
  3. 将数组转换回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)

答案 2 :(得分:0)

如果您可以在将对象传递给Set之前对其进行初始化。并保留对is的引用(即范围);

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); });