一、对象键值对数组转换
在处理对象数据时,常需要将键值对提取为二维数组以便后续操作。传统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']]
性能优化:对于超大型对象(>10,000属性),建议使用Object.entries()直接获取键值对数组,避免二次映射开销。
二、数组虚假值过滤
JavaScript中的虚假值(falsy values)包括false、0、""、null、undefined和NaN。使用Array.filter()配合Boolean构造函数可高效过滤:
const mixedArray = [0, 1, false, 2, '', 3, null, NaN, 4];const truthyArray = mixedArray.filter(Boolean);// 输出: [1, 2, 3, 4]
进阶技巧:若需保留0或空字符串等特定虚假值,可自定义过滤函数:
const customFilter = arr => arr.filter(x => x !== null && x !== undefined);
三、日期差值计算
计算两个日期之间的天数差需考虑时区问题,推荐使用UTC时间戳:
function getDayDifference(startDate, endDate) {const msPerDay = 24 * 60 * 60 * 1000;return Math.round((endDate - startDate) / msPerDay);}// 使用示例const start = new Date('2023-01-01');const end = new Date('2023-01-10');console.log(getDayDifference(start, end)); // 输出: 9
时间单位扩展:通过修改除数可获取秒/分钟/小时差值,如60 * 1000计算秒级差。
四、数组差异比较
寻找两个数组的差异值时,Set数据结构可显著提升性能:
function arrayDifference(arr1, arr2) {const set2 = new Set(arr2);return arr1.filter(x => !set2.has(x));}// 双向差异计算const diffBoth = (a, b) => ({onlyInA: arrayDifference(a, b),onlyInB: arrayDifference(b, a)});
应用场景:常用于权限列表对比、数据同步等场景。
五、数组转CSV格式
处理结构化数据导出时,需注意特殊字符转义:
function arrayToCSV(data, delimiter = ',') {return data.map(row =>row.map(cell => `"${String(cell).replace(/"/g, '""')}"`).join(delimiter)).join('\n');}// 使用示例const users = [['ID', 'Name'], [1, 'John "Doe"'], [2, 'Jane']];console.log(arrayToCSV(users));
性能提示:对于百万级数据,建议使用流式处理或Web Worker避免阻塞主线程。
六、元素出现次数统计
使用Array.reduce()实现计数器模式:
function countOccurrences(arr, target) {return arr.reduce((acc, curr) =>curr === target ? acc + 1 : acc, 0);}// 多元素统计版本function countAllOccurrences(arr) {return arr.reduce((acc, curr) => {acc[curr] = (acc[curr] || 0) + 1;return acc;}, {});}
时间复杂度:O(n)线性复杂度,适合处理大规模数据。
七、字符串首字母大写
处理用户输入或UI显示时常用此方法:
function capitalizeFirstLetter(str) {return str.charAt(0).toUpperCase() + str.slice(1);}// 多单词处理function capitalizeWords(str) {return str.split(' ').map(capitalizeFirstLetter).join(' ');}
正则优化版:
const capitalizeRegex = str => str.replace(/^\w|\s\w/g, c => c.toUpperCase());
八、数组最大值查找
除排序法外,更推荐使用展开运算符与Math.max:
const numbers = [3, 1, 4, 1, 5, 9, 2];const max = Math.max(...numbers); // 输出: 9// 空数组处理const safeMax = arr => arr.length ? Math.max(...arr) : undefined;
大数据优化:对于超长数组,可使用分治算法或Web Worker处理。
九、数组平均值计算
注意处理空数组和数值类型转换:
function calculateAverage(arr) {if (!arr.length) return 0;const sum = arr.reduce((a, b) => a + Number(b), 0);return sum / arr.length;}// 使用示例console.log(calculateAverage([1, 2, '3', 4])); // 输出: 2.5
精度处理:涉及金融计算时,建议使用BigInt或专用数学库。
十、JSON字符串验证
生产环境必须使用try-catch处理解析错误:
function isValidJSON(str) {try {JSON.parse(str);return true;} catch (e) {return false;}}// 严格模式验证(拒绝函数/Date等特殊对象)function isStrictJSON(str) {try {const obj = JSON.parse(str);return JSON.stringify(obj) === str;} catch {return false;}}
安全提示:验证通过后仍需对数据内容进行二次校验,防止注入攻击。
总结与最佳实践
- 性能优先:大数据处理时优先选择
Set、Map等数据结构 - 防御编程:所有数组操作前检查
length,字符串操作前检查typeof - 函数式组合:将多个简单函数组合使用,如
filter().map()链式调用 - 类型安全:使用
Number()、String()等显式转换,避免隐式类型转换陷阱 - 错误边界:关键操作必须添加try-catch或默认值回退机制
掌握这些核心技巧可显著提升JavaScript代码质量,特别在处理复杂业务逻辑时能减少80%以上的常见错误。建议开发者结合具体业务场景建立自己的工具库,持续积累可复用的解决方案。