一、对象与数组的转换技巧
1.1 对象键值对数组转换
在处理对象数据时,常需要将键值对提取为数组形式以便迭代操作。通过Object.keys()获取对象键数组,结合Array.map()方法可实现高效转换:
const obj = { name: 'Alice', age: 25, city: 'Beijing' };const keyValuePairs = Object.keys(obj).map(key => [key, obj[key]]);// 输出: [['name', 'Alice'], ['age', 25], ['city', 'Beijing']]
此方法时间复杂度为O(n),适用于需要保留键值关联的场景,如构建表格数据或API参数序列化。
1.2 数组虚假值过滤
处理用户输入或API响应时,需过滤null、undefined、0等虚假值。利用Array.filter()配合布尔值转换可实现:
const mixedArray = [0, 1, false, 2, '', 3, null, undefined];const truthyValues = mixedArray.filter(Boolean);// 输出: [1, 2, 3]
对于需要保留数字0的场景,可自定义过滤函数:
const customFilter = arr => arr.filter(x => x !== null && x !== undefined && x !== '');
二、日期与时间处理方案
2.1 日期差值计算
计算两个日期之间的天数差时,需考虑时区与闰秒问题。推荐使用时间戳差值计算:
function getDayDifference(startDate, endDate) {const timeDiff = Math.abs(endDate - startDate);return Math.ceil(timeDiff / (1000 * 60 * 60 * 24));}// 使用示例const start = new Date('2023-01-01');const end = new Date('2023-01-10');console.log(getDayDifference(start, end)); // 输出: 9
对于需要更高精度的场景,建议使用moment.js或date-fns等专业库。
2.2 数组差异比较
找出两个数组的差异元素时,使用Set数据结构可提升性能:
function arrayDifference(arr1, arr2) {const set2 = new Set(arr2);return arr1.filter(x => !set2.has(x));}// 示例:找出arr1中有但arr2中没有的元素const arr1 = [1, 2, 3, 4];const arr2 = [3, 4, 5, 6];console.log(arrayDifference(arr1, arr2)); // 输出: [1, 2]
此方法时间复杂度为O(n+m),比双重循环的O(n*m)方案更高效。
三、数组高级操作指南
3.1 数组转CSV格式
将多维数组转换为CSV字符串时,需处理特殊字符与分隔符:
function arrayToCSV(data, delimiter = ',') {return data.map(row =>row.map(cell => `"${String(cell).replace(/"/g, '""')}"`).join(delimiter)).join('\n');}// 示例const data = [['Name', 'Age', 'City'],['Alice', 25, 'Beijing,"China"'],['Bob', 30, 'Shanghai']];console.log(arrayToCSV(data));
此实现支持包含逗号和引号的单元格数据,符合RFC4180标准。
3.2 元素出现次数统计
使用Array.reduce()统计元素出现频率:
function countOccurrences(arr) {return arr.reduce((acc, val) => {acc[val] = (acc[val] || 0) + 1;return acc;}, {});}// 示例const fruits = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];console.log(countOccurrences(fruits));// 输出: { apple: 3, banana: 2, orange: 1 }
此方法可扩展为统计对象属性或复杂数据结构。
四、字符串处理最佳实践
4.1 首字母大写转换
实现标题格式转换时,需处理多单词情况:
function capitalizeFirstLetter(str) {return str.split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');}// 示例console.log(capitalizeFirstLetter('hello world')); // 输出: "Hello World"
对于非英语字符,建议使用Intl.Segmenter进行更精确的分词处理。
4.2 最大值快速查找
在未排序数组中查找最大值时,Math.max结合展开运算符最简洁:
const numbers = [3, 1, 4, 1, 5, 9, 2];const max = Math.max(...numbers); // 输出: 9
对于超大型数组(>100,000元素),建议使用分治法或流式处理避免堆栈溢出。
五、数据验证与安全处理
5.1 JSON有效性检查
验证字符串是否为有效JSON时,需捕获解析异常:
function isValidJson(str) {try {JSON.parse(str);return true;} catch (e) {return false;}}// 示例console.log(isValidJson('{"name": "Alice"}')); // trueconsole.log(isValidJson('<div>invalid</div>')); // false
对于敏感数据,建议增加类型验证和深度克隆:
function safeParseJson(str) {try {return JSON.parse(JSON.stringify(JSON.parse(str)));} catch {return null;}}
5.2 数组平均值计算
计算数值数组平均值时,需处理空数组和异常值:
function calculateAverage(arr) {if (!arr.length) return 0;const sum = arr.reduce((a, b) => {if (typeof b !== 'number' || isNaN(b)) return a;return a + b;}, 0);return sum / arr.filter(x => typeof x === 'number' && !isNaN(x)).length;}// 示例const mixedData = [1, 2, 'three', 4, NaN, 5];console.log(calculateAverage(mixedData)); // 输出: 3
六、性能优化建议
- 避免隐式类型转换:使用
===代替==减少意外行为 - 缓存DOM查询结果:频繁操作的DOM元素应存储在变量中
- 使用防抖节流:对滚动、resize等高频事件进行优化
- 合理使用Web Worker:将CPU密集型任务移至后台线程
- 代码分割与懒加载:减少初始加载体积
通过掌握这些核心技巧,开发者能够显著提升JavaScript代码的质量与执行效率。在实际项目中,建议结合ES6+新特性(如Proxy、Generator等)构建更健壮的解决方案。对于复杂业务场景,可考虑使用主流框架的状态管理方案或云服务商提供的低代码开发平台,进一步降低开发成本。