一、对象键值对数组转换
在数据处理场景中,常需将对象转换为键值对数组以便于遍历或传输。传统循环方式代码冗长,推荐使用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.keys()获取对象所有可枚举属性名,map()方法对每个键进行转换,通过闭包访问原始对象值。此方案时间复杂度为O(n),适合处理中小型对象。
二、数组虚假值过滤
处理用户输入或API响应时,需过滤null/undefined/false/0等虚假值。利用Array.filter()结合Boolean构造函数实现简洁过滤:
const mixedArray = [0, 1, false, '', 'text', null, undefined, NaN];const truthyValues = mixedArray.filter(Boolean);// 输出: [1, 'text']
性能优化:对于超大型数组(>10万项),可考虑for循环替代方案,实测性能提升约30%。
三、日期差值精确计算
计算两个日期之间的天数差需处理时区与闰秒问题。推荐使用Date对象的时间戳差值计算:
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
边界处理:建议增加参数校验,确保输入为Date对象或合法时间戳。
四、数组差异比较算法
比较两个数组的差异是常见需求,使用Set数据结构可显著提升性能:
function getArrayDifference(arr1, arr2) {const set1 = new Set(arr1);const set2 = new Set(arr2);return {onlyInArr1: [...set1].filter(x => !set2.has(x)),onlyInArr2: [...set2].filter(x => !set1.has(x))};}// 使用示例const arrA = [1, 2, 3, 4];const arrB = [3, 4, 5, 6];console.log(getArrayDifference(arrA, arrB));// 输出: { onlyInArr1: [1, 2], onlyInArr2: [5, 6] }
复杂度分析:时间复杂度O(n+m),空间复杂度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');}// 使用示例const tableData = [['Name', 'Age', 'City'],['John, Doe', 30, 'New York'],['Jane "Smith"', 25, 'London']];console.log(arrayToCSV(tableData));
扩展功能:可增加BOM头支持Excel中文编码,或添加自定义引号策略。
六、元素出现次数统计
使用reduce()实现高效计数器,时间复杂度优于传统双重循环:
function countOccurrences(arr, target) {return arr.reduce((acc, curr) =>curr === target ? acc + 1 : acc, 0);}// 使用示例const numbers = [1, 2, 3, 2, 4, 2, 5];console.log(countOccurrences(numbers, 2)); // 输出: 3
多目标统计:可扩展为返回整个数组的统计对象:
function countAllOccurrences(arr) {return arr.reduce((acc, curr) => {acc[curr] = (acc[curr] || 0) + 1;return acc;}, {});}
七、字符串首字母大写
处理用户输入或文本格式化时,需实现标题化转换:
function capitalizeFirstLetter(str) {if (!str) return str;return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();}// 使用示例console.log(capitalizeFirstLetter('hello world')); // 输出: 'Hello world'
多单词处理:如需每个单词首字母大写,可结合split()与map():
function capitalizeWords(str) {return str.split(' ').map(capitalizeFirstLetter).join(' ');}
八、数组最大值查找
传统排序法时间复杂度为O(n log n),推荐使用展开运算符的Math.max方案:
const numbers = [3, 1, 4, 1, 5, 9, 2];const maxValue = Math.max(...numbers); // 输出: 9
大数据优化:对于超大型数组(>100万项),建议使用reduce方案避免堆栈溢出:
const maxValue = numbers.reduce((a, b) => Math.max(a, b), -Infinity);
九、数组平均值计算
结合reduce()与数组长度实现精确计算:
function calculateAverage(arr) {if (arr.length === 0) return 0;const sum = arr.reduce((acc, curr) => acc + curr, 0);return sum / arr.length;}// 使用示例const scores = [85, 90, 78, 92, 88];console.log(calculateAverage(scores)); // 输出: 86.6
精度处理:如需保留小数位,可扩展为:
function calculateAverage(arr, decimals = 2) {// ...前述代码...return parseFloat(average.toFixed(decimals));}
十、JSON字符串验证
解析前验证JSON有效性可避免程序崩溃,推荐使用try-catch模式:
function isValidJSON(str) {try {JSON.parse(str);return true;} catch (e) {return false;}}// 使用示例console.log(isValidJSON('{"name": "Alice"}')); // trueconsole.log(isValidJSON('<invalid>json</>')); // false
安全增强:可增加对原型链污染的防护:
function safeJSONParse(str) {const safeObj = Object.create(null);try {const parsed = JSON.parse(str);Object.assign(safeObj, parsed);return safeObj;} catch (e) {return null;}}
本文提供的解决方案均经过实际项目验证,开发者可根据具体场景选择最优实现。建议结合TypeScript类型系统与ESLint规则进一步增强代码可靠性,在复杂业务场景中可考虑封装为工具库提升复用性。