如何在JavaScript中从两个数组生成仅含唯一单词的新数组?
获取两个数组的唯一值(对称差集)
你需要的是仅在其中一个数组中出现的元素(即两个数组的对称差集),而不是合并去重后的并集。之前用concat加Set得到的是所有出现过的元素去重,不符合你的需求;另外对于字符串这类原始值,Set是可以正确识别重复值的,不存在“将数组视为不同对象”的问题——你的示例数组都是字符串,所以这个问题并不存在。
下面是高效的实现方案,时间复杂度为O(n+m),适合处理大数据量:
const arr1 = ['apple', 'banana', 'cherry', 'date', 'elderberry']; const arr2 = ['cherry', 'date', 'elderberry', 'fig', 'grape']; // 转换为Set,利用其O(1)的查找效率 const set1 = new Set(arr1); const set2 = new Set(arr2); // 筛选出仅在arr1中存在的元素 const onlyInArr1 = [...set1].filter(item => !set2.has(item)); // 筛选出仅在arr2中存在的元素 const onlyInArr2 = [...set2].filter(item => !set1.has(item)); // 合并结果 const uniqueValues = onlyInArr1.concat(onlyInArr2); console.log(uniqueValues); // 输出: ['apple', 'banana', 'fig', 'grape']
更简洁的写法
如果追求代码简洁,可以合并筛选逻辑:
const set1 = new Set(arr1); const set2 = new Set(arr2); const uniqueValues = [...new Set([...arr1, ...arr2])].filter( item => set1.has(item) !== set2.has(item) );
为什么这个方法高效
Set的has()方法是O(1)时间复杂度,遍历两个数组和筛选的操作都是线性时间,整体比嵌套循环(O(n*m))或者用数组includes()(每次查找O(n))的方法高效得多,在数组元素数量较多时优势明显。
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

