JavaScript对象实现数组去重:困惑于赋值语句的作用
对象缓存法数组去重核心逻辑解析
先直接说关键:uniqueElements[element] = element是在给对象标记这个元素已经出现过,没有它,你的条件判断根本没法识别重复值。
拆解逻辑:
- 你写的
if(!uniqueElements[element])是在检查对象里有没有以当前元素为键的属性。JavaScript里,访问对象不存在的属性会返回undefined,而!undefined等于true——这就是第一次遇到元素时能进入判断、把元素加入结果数组的原因。 - 但如果不执行
uniqueElements[element] = element,这个对象永远不会记录任何元素。下次再遇到同一个元素时,uniqueElements[element]还是undefined,!undefined依然是true,判断会认为这是新元素,重复加入结果,自然就失去去重效果了。
举个实际例子(拿数组[2, 3, 2, 4]来说):
- 第一次处理
2:uniqueElements[2]是undefined,条件成立,把2放进结果数组。执行uniqueElements[2] = 2后,对象变成{2: 2}。 - 处理
3:同理,对象里没有3,加入结果,对象更新为{2:2, 3:3}。 - 再次处理
2:此时uniqueElements[2]的值是2,!2等于false,条件不成立,直接跳过,不会重复添加。 - 处理
4:正常加入结果,对象最终变成{2:2, 3:3, 4:4}。
额外提个细节(避免踩坑):
对象的键会被自动转成字符串,比如数字1和字符串'1'会被当成同一个键。如果你的数组里同时有这两种类型,用这种方法会误判,但如果是同类型元素去重,这个逻辑完全没问题。
内容的提问来源于stack exchange,提问作者ggvibesonly
相关产品推荐
相关产品推荐

