对于在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循环,但是如何指定要删除的特定对象呢? 任何帮助将不胜感激。 :)
答案 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)
我通常要做的是
*小心,因为这会考虑键的顺序。
您可以使用此功能:
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); });