ES6 关于Set对象

  许多用以前方法去实现需要一大串代码的,用ES6竟然几句就搞定了。

  Set对象是ES6中新增的类型,可以自动排除重复项,生成Set对象后,可以轻松遍历它所包含的内容

  例如,遍历字符串。

var str = new Set("Hello world!");
for(var str1 of str){
  console.log(str1+" ")  
}
结果会是这样:H e l o w r d !

  为什么会是这样,因为Set对象会自动排除重复项。

  到了这里,我们可以很容易的想到使用Set对象进行数组去重,没错,通过该方法确实是挺方便的。 

var arr = [12,23,45,34,56,56,87,23,45,12,89];
var arr1 = new Set(arr);
var arr2 = [];
for(var arr3 of arr1){
    arr2.push(arr3)
}
console.log(arr2)

 

  另一种数组去重法:

function foo(arr){
    return Array.from(new Set(arr))  // Array.from方法可以将 Set 结构转为数组
}
const items = [1,2,3,4,5,6,7,1,2,1,3,1,2,3]
console.log(foo(items))

  Set函数接受数组作为参数,再使用Array.from将其转换为数组,从而达到去重的目的

 

  还有一种更简洁的;

let arr1 = [12,13,23,45,46,48,78,79,45,12,13,23];
let arr = new Set(arr1)
console.log([...arr])  // [ 12, 13, 23, 45, 46, 48, 78, 79 ]

转载于:https://www.cnblogs.com/sunjuncoder/p/9895291.html

<think>嗯,用户现在问的是如何将ES6Set转换为对象。之前他们问过如何新建Set和Map,现在可能是在实际应用中遇到了需要转换的情况。首先,我需要理解用户的需求。Set是一个存储唯一值的集合,而对象是键值对的集合。用户可能想把Set的元素作为对象的属性或者值,或者是其他形式的转换。 常见的转换方式可能有几种:比如将Set的元素作为对象的属性,值设为true;或者将Set转成数组,再转成对象,可能用索引作为键。需要明确用户想要哪种结构。用户可能没有说明具体的转换方式,所以需要列举几种常见的方法,并说明它们的应用场景。 接下来要考虑用户的潜在需求。例如,用户可能想快速检查某个元素是否存在,所以将Set转为对象,属性名是元素,值都是true,这样可以用in操作符快速判断。或者用户需要保留顺序,用索引作为键,这样可能更接近数组的结构,但对象本身不保证顺序,不过ES6之后对象的数字键是有序的。 另外,需要注意Set中的元素类型。如果元素是Symbol或者对象,转为对象的键时可能会有问题,因为对象的键只能是字符串或Symbol。如果元素是对象,直接转为字符串键可能不是用户想要的,这时候可能需要其他处理方式,比如序列化或者使用Map。 还要提醒用户可能的注意事项,比如元素类型的问题,以及对象键的覆盖情况,如果有重复的键(虽然Set本身不会有重复值),但如果是不同的值转换为相同的字符串键,就会覆盖。例如,数字1和字符串'1'在对象中会被视为同一个键。 最后,可能需要给出示例代码,展示不同的转换方法,并说明每种方法的适用场景,帮助用户根据实际需求选择合适的方式。同时,可能需要比较不同方法的优缺点,比如使用展开运算符和Array.from的区别,或者直接遍历Set添加属性的方法。</think>以下是 ES6 Set 转换为对象的 4 种实用方法及详细说明: ### 一、基础转换:元素作为属性 ```javascript const numSet = new Set(['apple', 42, true]); // 方法1:遍历添加 const obj1 = {}; numSet.forEach(value => { obj1[value] = true; // 值作为属性名,统一赋予 true }); // 结果:{42: true, apple: true, true: true} // 方法2:使用展开运算符 + Object.assign const obj2 = Object.assign({}, [...numSet].map(v => ({ [v]: true }))); // 结果:同上 ``` ### 二、带索引的转换(类似数组结构) ```javascript // 方法3:索引作为键 const obj3 = { ...[...numSet] }; // 结果:{0: "apple", 1: 42, 2: true} // 方法4:使用 Array.from 转换 const obj4 = Array.from(numSet).reduce((acc, cur, idx) => { acc[idx] = cur; return acc; }, {}); // 结果:同上 ``` ### 三、特殊值处理对比 | 原始值类型 | 转换后表现 | 注意事项 | |------------------|-------------------------------------|-----------------------------| | Symbol | `Symbol() → '[object Symbol]'` | 丢失唯一性,需特殊处理 | | Object | `{} → '[object Object]'` | 多个不同对象会被合并 | | NaN | `NaN → 'NaN'` | 正常转换 | | undefined/null | `undefined → 'undefined'` | 可作为合法属性名 | ### 四、实际应用场景 1. **快速存在性检测**: ```javascript const allowedTypes = new Set(['video/mp4', 'image/png']); const checkerObj = Object.fromEntries([...allowedTypes].map(v => [v, true])); if(checkerObj[file.type]) { // 比 Set.has() 性能略低但兼容旧代码 // 执行操作 } ``` 2. **与旧代码交互**: ```javascript // 将 Set 转换为符合接口要求的对象结构 const apiFormat = { uniqueItems: [...new Set(dataArray)], count: new Set(dataArray).size }; ``` ### 五、注意事项 1. **类型丢失问题**: ```javascript const specialSet = new Set([123, '123']); const badObj = Object.fromEntries([...specialSet].map(v => [v, true])); // 结果:{'123': true} → 数字和字符串键发生覆盖 ``` 2. **推荐替代方案**: ```javascript // 需要保留类型信息时建议使用 Map const typeSafeMap = new Map(); specialSet.forEach(value => { typeSafeMap.set(value, true); }); ``` 3. **性能对比**: - `Set.has()` 时间复杂度为 $O(1)$ - 对象属性检测 `key in obj` 时间复杂度为 $O(1)$ - 转换过程需要 $O(n)$ 时间复杂度 根据实际需求,如果仅需临时使用对象特性,推荐优先保持 Set 结构。需要长期使用时,建议评估数据复杂度后选择 Map 或对象方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值