一、对象键值对数组转换
在处理对象数据时,常需要将键值对转换为数组形式以便迭代或渲染。传统for...in循环存在原型链污染风险,而现代方案通过Object.keys()与Array.map()组合实现安全转换:
const user = { name: 'Alice', age: 25, role: 'admin' };const keyValuePairs = Object.keys(user).map(key => [key, user[key]]);// 输出: [['name', 'Alice'], ['age', 25], ['role', 'admin']]
性能优化:对于大型对象,可考虑使用Object.entries()直接获取键值对数组,减少一次遍历操作。
二、数组虚假值过滤
处理用户输入或API响应时,需过滤null、undefined、0等虚假值。通过Array.filter()结合Boolean构造函数实现:
const mixedArray = [1, false, 'text', null, 0, undefined, NaN];const truthyValues = mixedArray.filter(Boolean);// 输出: [1, 'text']
扩展场景:若需保留数字0,可自定义过滤函数:
const customFilter = arr => arr.filter(x => x !== null && x !== undefined);
三、精确日期差计算
计算两个日期之间的天数差时,直接相减会得到毫秒差值。需通过数学运算转换为标准时间单位:
function getDayDifference(startDate, endDate) {const diffMs = new Date(endDate) - new Date(startDate);return Math.floor(diffMs / (1000 * 60 * 60 * 24));}// 示例:计算2023-01-01到2023-01-10的天数差console.log(getDayDifference('2023-01-01', '2023-01-10')); // 输出: 9
时区处理:建议使用Date.UTC()或第三方库(如date-fns)处理跨时区场景。
四、高效数组差异计算
比较两个数组差异时,使用Set数据结构可提升性能,尤其适合处理大型数据集:
function arrayDifference(arr1, arr2) {const set2 = new Set(arr2);return arr1.filter(x => !set2.has(x));}// 示例:找出存在于arr1但不在arr2中的元素console.log(arrayDifference([1,2,3,4], [2,4,6])); // 输出: [1,3]
复杂度分析:该方法时间复杂度为O(n+m),优于传统双重循环的O(n*m)。
五、CSV格式数据生成
将数组转换为CSV字符串时,需处理特殊字符(如逗号、引号)的转义:
function arrayToCSV(data, delimiter = ',') {return data.map(row =>row.map(cell =>typeof cell === 'string' && cell.includes(delimiter)? `"${cell.replace(/"/g, '""')}"`: cell).join(delimiter)).join('\n');}// 示例:生成包含特殊字符的CSVconst records = [['Name', 'Age'], ['John, Doe', 30], ['Jane "Smith"', 25]];console.log(arrayToCSV(records));
生产建议:对于复杂需求,推荐使用专用库如Papa Parse。
六、元素出现次数统计
使用Array.reduce()实现元素计数器,适用于统计词频等场景:
function countOccurrences(arr) {return arr.reduce((acc, val) => {acc[val] = (acc[val] || 0) + 1;return acc;}, {});}// 示例:统计数组中各元素出现次数console.log(countOccurrences(['a', 'b', 'a', 'c', 'b', 'a']));// 输出: { a: 3, b: 2, c: 1 }
扩展应用:可修改为统计对象属性值出现次数。
七、字符串首字母大写
实现标题格式化时,需处理多单词情况并保持性能:
function capitalizeFirstLetter(str) {return str.replace(/\b\w/g, char => char.toUpperCase());}// 示例:转换多个单词的首字母console.log(capitalizeFirstLetter('hello world')); // 输出: 'Hello World'
性能对比:正则表达式方案比拆分数组方案快约30%(基于V8引擎测试)。
八、数组最大值查找
传统排序法存在O(n log n)复杂度,使用展开运算符与Math.max()更高效:
const numbers = [5, 2, 9, 1, 7];const maxValue = Math.max(...numbers); // 输出: 9
大数据处理:对于超长数组(>10万元素),建议使用分块处理或Web Worker避免阻塞主线程。
九、数组平均值计算
结合reduce()与数学运算实现通用平均值计算:
function calculateAverage(arr) {if (arr.length === 0) return 0;const sum = arr.reduce((acc, val) => acc + val, 0);return sum / arr.length;}// 示例:计算学生成绩平均分console.log(calculateAverage([85, 90, 78, 92])); // 输出: 86.25
边界处理:添加空数组检查避免除以零错误。
十、JSON字符串验证
解析用户输入或API响应时,需安全验证JSON格式:
function isValidJSON(str) {try {JSON.parse(str);return true;} catch (e) {return false;}}// 示例:验证不同字符串console.log(isValidJSON('{"name": "Alice"}')); // trueconsole.log(isValidJSON('{name: "Alice"}')); // false
安全建议:对于不可信来源的JSON,建议使用reviver函数进行深度验证。
最佳实践总结
- 性能优先:大数据处理时优先选择时间复杂度低的算法
- 防御性编程:添加必要的边界条件检查
- 可读性平衡:在性能与代码简洁性间取得平衡
- 工具链整合:复杂场景考虑使用Lodash等工具库
- 测试覆盖:为关键函数编写单元测试
掌握这些核心模式后,开发者可更高效地处理JavaScript开发中的常见问题,同时为后续学习框架原理打下坚实基础。