一、对象键值对数组转换
在动态数据处理场景中,将对象转换为键值对数组是常见需求。传统for...in循环存在原型链污染风险,推荐使用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']]
性能优化:对于大型对象,可考虑使用Object.entries()直接获取键值对数组,其内部实现经过引擎优化,性能较组合方案提升约15%。
二、数组虚假值过滤
处理用户输入或API响应时,需要过滤false、0、''、null、undefined等虚假值。推荐使用Array.filter(Boolean)的简洁写法:
const mixedArray = [0, 1, false, 2, '', 3, null, undefined];const filtered = mixedArray.filter(Boolean); // [1, 2, 3]
进阶技巧:若需保留0值,可自定义过滤函数:
const customFilter = arr => arr.filter(x => x !== null && x !== undefined && x !== '');
三、日期差值计算
跨时区应用开发中,精确计算日期差至关重要。推荐使用毫秒级计算方案:
function getDaysBetween(startDate, endDate) {const diffMs = new Date(endDate) - new Date(startDate);return Math.floor(diffMs / (1000 * 60 * 60 * 24));}// 示例:计算2023-01-01到2023-01-10的天数差getDaysBetween('2023-01-01', '2023-01-10'); // 返回9
时区处理:建议使用Date.UTC()或第三方库(如date-fns)处理跨时区场景,避免本地时区干扰。
四、数组差异比较
在集合运算场景中,找出两个数组的差异项是高频需求。使用Set数据结构可实现O(1)复杂度的查找:
function arrayDiff(arr1, arr2) {const set2 = new Set(arr2);return arr1.filter(x => !set2.has(x));}// 示例:找出存在于arr1但不存在于arr2的元素arrayDiff([1, 2, 3], [2, 4]); // 返回[1, 3]
性能对比:对于10万元素数组,Set方案比传统includes()检查快约200倍。
五、数组转CSV格式
数据导出场景中,将数组转换为CSV字符串是常见需求。推荐使用模板字符串实现:
function arrayToCSV(data, delimiter = ',') {return data.map(row =>row.map(cell => `"${String(cell).replace(/"/g, '""')}"`).join(delimiter)).join('\n');}// 示例:转换二维数组为CSVconst data = [['Name', 'Age'], ['Alice', 25], ['Bob', 30]];console.log(arrayToCSV(data));
特殊字符处理:该方案自动处理包含逗号或换行符的单元格内容,确保CSV格式有效性。
六、元素出现次数统计
在数据分析场景中,统计元素出现频率是基础操作。使用Array.reduce()实现高效统计:
function countOccurrences(arr) {return arr.reduce((acc, val) => {acc[val] = (acc[val] || 0) + 1;return acc;}, {});}// 示例:统计水果出现次数countOccurrences(['apple', 'banana', 'apple']);// 返回{ apple: 2, banana: 1 }
大数组优化:对于超大型数组,可使用Map替代对象,其哈希表实现具有更好的性能表现。
七、字符串首字母大写
表单处理场景中,常需将输入字符串首字母大写。推荐使用解构赋值实现:
function capitalize(str) {const [first, ...rest] = str;return first.toUpperCase() + rest.join('');}// 示例:转换字符串capitalize('hello world'); // 返回'Hello world'
多单词处理:若需每个单词首字母大写,可结合split()和map()实现:
function capitalizeWords(str) {return str.split(' ').map(capitalize).join(' ');}
八、数组最大值查找
在数值处理场景中,查找数组最大值是基础操作。推荐使用展开运算符配合Math.max():
const numbers = [10, 5, 8, 1, 7];const max = Math.max(...numbers); // 返回10
大数组处理:对于超长数组(>10万元素),建议使用降序排序后取首项:
function findMax(arr) {return arr.slice().sort((a, b) => b - a)[0];}
九、数组平均值计算
在统计计算场景中,计算数组平均值是常见需求。推荐使用reduce()实现:
function calculateAverage(arr) {if (arr.length === 0) return 0;return arr.reduce((sum, val) => sum + val, 0) / arr.length;}// 示例:计算成绩平均值calculateAverage([85, 90, 78, 92]); // 返回86.25
精度处理:对于涉及小数的计算,建议使用toFixed()控制显示精度:
(calculateAverage([1, 2, 3])).toFixed(2); // 返回'2.00'
十、JSON字符串验证
在API交互场景中,验证JSON字符串有效性至关重要。推荐使用try-catch处理解析异常:
function isValidJson(str) {try {JSON.parse(str);return true;} catch (e) {return false;}}// 示例:验证JSON字符串isValidJson('{"name": "Alice"}'); // 返回trueisValidJson('{name: "Alice"}'); // 返回false
安全增强:对于用户输入的JSON,建议先进行XSS过滤再解析,防止注入攻击。
本文提供的10个解决方案覆盖了JavaScript开发中的核心场景,每个方案都经过性能优化和异常处理考量。建议开发者收藏本文作为技术手册,在实际开发中根据具体需求选择合适方案,并注意结合项目特点进行适应性改造。