电商商城网站东莞市疾控中心地址
2026/6/10 2:58:48 网站建设 项目流程
电商商城网站,东莞市疾控中心地址,网上合同,做网站如何让盈利JavaScript 数组去重有多种方法#xff0c;性能差异显著。以下是常用方法及其性能对比#xff1a;1. ES6 Set#xff08;推荐#xff09;javascript// 最快#xff0c;代码最简洁 function uniqueSet(arr) {return [...new Set(arr)];// 或 Array.from(new Set(arr)) }2. …JavaScript 数组去重有多种方法性能差异显著。以下是常用方法及其性能对比1. ES6 Set推荐javascript// 最快代码最简洁 function uniqueSet(arr) { return [...new Set(arr)]; // 或 Array.from(new Set(arr)) }2. Filter indexOfjavascriptfunction uniqueFilter(arr) { return arr.filter((item, index) arr.indexOf(item) index); }3. Reducejavascriptfunction uniqueReduce(arr) { return arr.reduce((acc, cur) { if (!acc.includes(cur)) { acc.push(cur); } return acc; }, []); }4. 双层循环javascriptfunction uniqueDoubleLoop(arr) { const result []; for (let i 0; i arr.length; i) { let isDuplicate false; for (let j 0; j result.length; j) { if (arr[i] result[j]) { isDuplicate true; break; } } if (!isDuplicate) result.push(arr[i]); } return result; }5. Object键值仅字符串javascriptfunction uniqueObject(arr) { const obj {}; const result []; for (let i 0; i arr.length; i) { if (!obj[arr[i]]) { obj[arr[i]] true; result.push(arr[i]); } } return result; }性能对比测试javascript// 生成测试数据 const testArray []; for (let i 0; i 10000; i) { testArray.push(Math.floor(Math.random() * 1000)); } // 性能测试函数 function testPerformance(fn, arr, name) { const start performance.now(); fn([...arr]); // 避免修改原数组 const end performance.now(); console.log(${name}: ${(end - start).toFixed(2)}ms); } // 测试 console.log(10000个元素的数组去重性能对比:); testPerformance(uniqueSet, testArray, Set); testPerformance(uniqueFilter, testArray, Filter); testPerformance(uniqueReduce, testArray, Reduce); testPerformance(uniqueDoubleLoop, testArray, 双层循环); testPerformance(uniqueObject, testArray, Object键值);性能排名从快到慢Set- O(n) - 最快代码最简洁Object键值- O(n) - 较快但仅适用于字符串或可转字符串的值Filter indexOf- O(n²) - 中等代码简洁但性能随数据量下降Reduce- O(n²) - 中等偏慢双层循环- O(n²) - 最慢特殊场景考虑处理复杂对象javascript// 对象数组去重基于某个属性 function uniqueByKey(arr, key) { const map new Map(); return arr.filter(item { if (!map.has(item[key])) { map.set(item[key], true); return true; } return false; }); } // 使用JSON.stringify性能较差 function uniqueObjects(arr) { const set new Set(); return arr.filter(obj { const str JSON.stringify(obj); if (set.has(str)) return false; set.add(str); return true; }); }保持顺序大多数方法Set、Filter、Reduce都能保持原始顺序但Object键值不保证顺序。总结建议方法推荐度适用场景Set⭐⭐⭐⭐⭐绝大多数场景ES6环境Object键值⭐⭐⭐简单值且不关心类型转换Filter⭐⭐小数组简洁代码优先Reduce⭐⭐需要复杂处理逻辑双层循环⭐学习算法时实际开发不推荐最佳实践现代项目直接使用[...new Set(arr)]需要考虑兼容性时使用polyfill或lodash的_.uniq()大型数组优先考虑时间复杂度O(n)的方法扩展运算符Spread Operator...总结类别语法描述示例基本概念...iterable将可迭代对象展开为独立元素...array,...string数组操作复制数组const newArr [...arr]浅拷贝数组const arr1 [1,2,3]; const arr2 [...arr1]合并数组[...arr1, ...arr2]合并多个数组[1,2, ...arr, 4,5]数组去重[...new Set(arr)]配合Set快速去重[...new Set([1,2,2,3])] // [1,2,3]插入元素[first, ...rest]结合解构分离首元素const [first, ...others] [1,2,3,4]对象操作复制对象const newObj {...obj}浅拷贝对象属性const obj1 {a:1}; const obj2 {...obj1}合并对象{...obj1, ...obj2}合并对象后者覆盖前者{...defaults, ...options}添加属性{...obj, newProp: value}添加新属性{...user, age: 25}覆盖属性{...obj, prop: newValue}修改已有属性值{...user, name: Bob}函数应用函数参数func(...args)将数组展开为函数参数Math.max(...[1,2,3])剩余参数function(...args){}收集剩余参数为数组function sum(...nums){...}字符串操作字符串转数组[...str]正确处理Unicode字符[...hello] // [h,e,l,l,o]表情符号处理[...‍‍]正确处理组合emoji[...] // []可迭代对象NodeList转数组[...document.querySelectorAll(div)]类数组转真正数组const divs [...document.querySelectorAll(div)]Arguments转数组[...arguments]函数arguments转数组function f(){ return [...arguments]; }Map/Set转数组[...map],[...set]Map/Set转为数组[...new Set([1,2,2])] // [1,2]组合使用数组解构[first, ...rest] arr提取首元素和剩余数组const [head, ...tail] [1,2,3,4]对象解构{a, ...rest} obj提取指定属性和剩余属性const {id, ...data} obj嵌套展开[...arr1, mid, ...arr2]在任意位置展开数组[0, ...middle, 9]注意事项浅拷贝{...obj},[...arr]只拷贝一层嵌套对象引用共享{...obj}不会深拷贝嵌套对象不可迭代错误...123数字等不可迭代对象会报错...123 // TypeError性能考虑大数组展开大数组展开可能影响性能避免在循环中频繁展开大数组特殊技巧条件展开{...obj, ...(cond {prop: val})}条件添加属性{...obj, ...(show {visible: true})}移除属性{propToRemove, ...rest} obj结合解构移除属性const {password, ...safeUser} user默认值覆盖{...defaults, ...overrides}设置默认值并允许覆盖const config {...defaultConfig, ...userConfig}关键特点总结浅拷贝只复制一层嵌套对象是引用可迭代性只能用于可迭代对象数组、字符串、Set、Map等不可变操作创建新对象/数组不修改原数据顺序重要在对象合并中后面的属性覆盖前面的ES6特性需要Babel转译以支持旧浏览器实用示例javascript// 1. 快速数组合并去重 const uniqueMerge [...new Set([...arr1, ...arr2])]; // 2. 带默认值的对象配置 const createConfig (userConfig) ({ port: 3000, host: localhost, ...userConfig }); // 3. 安全的删除属性 const removePassword ({password, ...user}) user; // 4. 数组插入元素 const insertAt (arr, index, ...items) [ ...arr.slice(0, index), ...items, ...arr.slice(index) ];扩展运算符是现代JavaScript开发中最常用、最简洁的特性之一极大简化了数组和对象的操作。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询