PHP的array_unique函数对应的JavaScript原生等价方法是什么?
数组去重实现方案
ES6+ 原生极简实现
ES2015(ES6)之后官方提供的Set数据结构天生支持元素唯一性,是目前性能最优、写法最简洁的数组去重方案,完全可以等价实现你需要的PHP array_unique 基础功能,时间复杂度为O(n),远优于双层循环的O(n²)。Set 基于严格相等(===)做元素对比,针对字符串、数字、布尔值、null、undefined、Symbol 这类基础类型的去重效果和PHP array_unique 默认行为一致,且会保留元素在原数组中第一次出现的顺序,和需求完全匹配。
示例代码:
let fruitBowl = [ 'apple', 'apple', 'apple', 'apple', 'apple', 'banana', 'banana', 'cherry', 'cherry', 'cherry', 'damson', 'elderberry', 'fig', 'fig' ]; // 一行实现数组去重 const uniqueFruitBowl = [...new Set(fruitBowl)]; // 也可写作 Array.from(new Set(fruitBowl)) console.log(uniqueFruitBowl);
ES5 兼容版本实现
如果需要兼容不支持ES6的旧版环境,可以用哈希表的方式实现单次遍历去重,性能同样远优于双层嵌套循环,不会频繁触发数组重排:
function arrayUnique(arr) { var seen = {}; var result = []; for (var i = 0; i < arr.length; i++) { var item = arr[i]; if (!seen[item]) { seen[item] = true; result.push(item); } } return result; } // 调用示例 var uniqueFruitBowl = arrayUnique(fruitBowl); console.log(uniqueFruitBowl);
特殊场景补充
如果需要对引用类型(比如对象、数组)做去重,需要自定义匹配规则,比如根据对象的指定字段判断重复,可采用如下写法:
// 示例:针对对象数组根据id字段去重 const uniqueArr = arr.filter((item, index, self) => self.findIndex(i => i.id === item.id) === index );
你当前的双层循环倒序遍历+splice的方式,除了时间复杂度高之外,splice操作会修改原数组,而且每次删除元素都会触发数组重排,额外增加性能消耗,更推荐用上面的方案生成新数组,避免意外修改原数据。
内容的提问来源于stack exchange,提问作者Rounin
相关产品推荐
相关产品推荐

