首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js 对象 set方法调用

JavaScript 中的 Set 是一种特殊的类型,它允许你存储唯一的值,无论是原始值或者是对象引用。Set 对象保存值的唯一性是通过使用其内部算法,在添加新元素时比较它们来实现的。

基础概念

  • 唯一性Set 中的每个元素只能出现一次。
  • 无序性Set 中的元素没有特定的顺序。
  • 可迭代:可以使用 for...of 循环遍历 Set

相关优势

  1. 自动去重:无需编写额外的代码来检查元素是否已存在。
  2. 高效的查找Set 内部优化了成员检测的性能。
  3. 简洁的语法:使用 add 方法可以轻松地向集合中添加元素。

类型

  • 基本类型:如数字、字符串、布尔值等。
  • 对象引用:可以存储对象的引用,但不会比较对象的内容。

应用场景

  • 数据去重:在处理数组时去除重复项。
  • 成员检测:快速检查某个值是否存在于集合中。
  • 集合运算:如并集、交集、差集等。

示例代码

代码语言:txt
复制
// 创建一个新的 Set
let mySet = new Set();

// 添加元素
mySet.add(1); // Set { 1 }
mySet.add(2); // Set { 1, 2 }
mySet.add(1); // 重复的值不会被添加,结果仍然是 Set { 1, 2 }

// 检查元素是否存在
console.log(mySet.has(1)); // true
console.log(mySet.has(3)); // false

// 删除元素
mySet.delete(1); // 返回 true,现在集合是 Set { 2 }

// 获取集合的大小
console.log(mySet.size); // 1

// 清空集合
mySet.clear(); // 集合现在是空的

可能遇到的问题及解决方法

问题:尝试向 Set 中添加复杂对象时,即使两个对象的内容相同,它们也被视为不同的元素。

原因Set 判断唯一性的依据是引用地址,而不是对象的内容。

解决方法:在添加对象之前,可以自定义一个比较函数来决定两个对象是否相等,或者使用 Map 结构,将对象的某个唯一属性作为键。

代码语言:txt
复制
// 使用 Map 来处理对象内容的唯一性
let myMap = new Map();

function addObject(map, obj) {
  // 假设每个对象都有一个唯一的 id 属性
  if (!map.has(obj.id)) {
    map.set(obj.id, obj);
  }
}

let obj1 = { id: 1, name: 'Alice' };
let obj2 = { id: 2, name: 'Bob' };
let obj3 = { id: 1, name: 'Alice' }; // 内容与 obj1 相同,但 id 不同

addObject(myMap, obj1);
addObject(myMap, obj2);
addObject(myMap, obj3);

console.log(myMap.size); // 输出 2,因为 obj3 的 id 与 obj1 相同,所以没有被添加

通过这种方式,可以确保即使对象的内容相同,只要它们的唯一标识不同,就可以被添加到集合中。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

PHP中 对象自动调用的方法:__set()、__get()、__tostring()

(2)__set($property_name, $value):直接给私有属性赋值时,此对象会自动调用该方法,把属性比如name传给$property_name, 把要赋的值                                                         ...这个方法同样不用我们手工去调用,它也可以做成私有的,是在直接设置私有属性值的时候自动调用的,同样属性私有的已经被封装上 了, 如果没有__set()这个方法,是不允许的,比如:$this->name=‘...如果成员属性不封装成私有的,对象本身就不会去自动调用这个方 法。为了不传入非法的值,还可以在这个方法给做一下判断。代码如下: set($property_name, $value) { echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值";...比如打印一个对象时,看看这个对象都有哪些属 性,其值是什么,如果类定义了toString方法,就能在测试时,echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据

2.6K40
  • 【Flutter】Dart 面向对象 ( get 方法 | set 方法 | 静态方法 )

    文章目录 一、 get 和 set 方法 二、 静态方法 三、 相关资源 一、 get 和 set 方法 ---- get 方法 : 置私有字段的 get 方法 , 让外界可以访问类对象的私有成员 ;...Person 对象的 _achievement 私有成员 int get achievement => _achievement; set 方法 : 置私有字段的 set 方法 , 让外界可以设置类对象的私有成员...的 set 方法, // 让外界可以设置 Person 对象的 _achievement 私有成员值 set achievement(int achievement){...: $age"; } } 二、 静态方法 ---- 使用 static 关键字标识的方法是静态方法 ; 静态方法可以使用 类名.静态方法名 进行调用 , 不必通过对象调用 ; 静态方法示例 : /...的 set 方法, // 让外界可以设置 Person 对象的 _achievement 私有成员值 set achievement(int achievement){

    3K00

    js对象拷贝方法

    ; 它不会拷贝对象的不可枚举的属性; 不可以拷贝对象中的对象; 可以拷贝 Symbol 类型的属性; 无法正确拷贝属性和属性 可以拷贝undefined/boolean/null/function/Date...这几种类型,经过 JSON.stringify 序列化之后的字符串中这个键值对会消失; 拷贝 Date 引用类型会变成字符串; 无法拷贝不可枚举的属性; 无法拷贝对象的原型链; 拷贝 RegExp 引用类型会变成空对象...; 对象中含有 NaN、Infinity 以及 -Infinity,JSON 序列化的结果会变成 null; 无法拷贝对象的循环引用,如果对象中有循环引用,会报错: Uncaught TypeError...JavaScript内置对象的复制: Set、Map、Date、RegExp等 * 2....Set、Map else if (type === "[object Set]") { result = new Set(); for (const value

    2.4K20

    【Android NDK 开发】JNI 方法解析 ( CC++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )

    调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV ....调用 Java 对象方法 ( CallXxxMethod ) IX . 调用 Java 类静态方法 ( CallStaticXxxMethod ) X . 完整代码示例 I ...., …) 调用 Java 对象方法 , void CallStaticVoidMethod(jclass clazz, jmethodID methodID, …) 调用 Java 的静态方法 ;...CalXxxMethod 方法 , 其中的 Xxx 是 Java 对象的 返回值 , 不同的返回值调用不同的方法 ; II ....调用 Java 对象的方法 /* 调用 Java 引用对象的方法 : 要根据 返回值类型不同 , 调用不同的方法 如果返回值是 int 类型 , 那么就需要调用

    8.5K40

    PHP面向对象-对象方法的调用和参数传递

    对象方法的调用要调用对象方法,需要先创建对象,然后使用对象名和方法名调用该方法。..."; }}// 创建一个 Person 对象$person = new Person();$person->name = "John";$person->age = 30;// 调用对象方法$person...最后,我们使用对象名和方法名调用 sayHello() 方法,并输出结果。对象方法的参数传递在 PHP 中,我们可以在对象方法中传递参数。对象方法的参数传递方式与普通函数相同。...+ $num2; }}// 创建一个 Calculator 对象$calculator = new Calculator();// 调用对象方法并传递参数$result = $calculator-...最后,我们调用 $calculator 对象的 add() 方法,并传递两个参数 10 和 20。最终,将 add() 方法返回的结果存储在变量 $result 中,并使用 echo 语句将其输出。

    1.9K10

    学习zepto.js(对象方法)

    学习zepto.js(对象方法)[4] 今天说说那一套获取元素集合的一些方法: ["children", "clone", "closest", "contents", "empty...上边那个过滤方法用的地方比较多,所以给它放在上边; children方法调用的filtered传入的是两个参数,第一个是一个集合,将所有对象的所有的子节点取出,并放入一个集合;children方法内部调用的...我们调用的是对象方法,而对象方法调用的那个就是一个普通的内部私有函数- -(望理解它们之间的区别); 返回的是做一个兼容处理的获取子元素的实现,如果节点存在children属性就直接取出,不存在的话,就循环...首先函数内部判断传入选择器类型,如果是个functin,妥妥的循环对象并执行它. 否则就判断选择器类型是否为字符串,如果是,则调用filter方法....如果不是一个字符串,就判断是否是一个类数组,并且对象的item是一个方法,(是的,变相的判断为一个zepto对象.) 其余的情况,直接通过参数构建一个zepto对象.

    2.5K60
    领券