一、对象与数组的转换技巧
1.1 对象键值对数组转换
在数据处理场景中,常需要将对象转换为键值对数组以便迭代处理。传统方案使用Object.keys()配合map()实现,但现代JavaScript提供了更简洁的语法:
const user = { name: 'Alice', age: 25 };// 传统方案const entries1 = Object.keys(user).map(key => [key, user[key]]);// ES2017方案const entries2 = Object.entries(user); // 直接返回[[key,value]]数组
优化建议:优先使用Object.entries(),其性能比组合方法提升约30%,且代码可读性更强。
1.2 数组虚假值过滤
处理用户输入或API响应时,需要过滤掉null、undefined、0等虚假值。推荐使用filter()配合Boolean转换:
const mixedArray = [0, 1, false, true, '', 'text', null, undefined];const truthyValues = mixedArray.filter(Boolean);// 结果: [1, true, 'text']
进阶技巧:如需保留数字0,可自定义过滤函数:
const customFilter = arr => arr.filter(x => x !== null && x !== undefined && x !== '');
二、日期与时间处理方案
2.1 日期差值计算
计算两个日期的间隔天数时,需注意时区问题和闰秒处理。推荐方案:
function getDaysBetween(startDate, endDate) {const msPerDay = 1000 * 60 * 60 * 24;return Math.round((endDate - startDate) / msPerDay);}// 使用示例const start = new Date('2023-01-01');const end = new Date('2023-01-10');console.log(getDaysBetween(start, end)); // 9
注意事项:
- 使用
Math.round()避免浮点数误差 - 考虑使用
Date.UTC()处理跨时区场景 - 对于商业计算,建议使用专业库如
date-fns
2.2 时间格式化输出
将日期对象格式化为YYYY-MM-DD的推荐实现:
function formatDate(date) {const pad = num => num.toString().padStart(2, '0');return `${date.getFullYear()}-${pad(date.getMonth()+1)}-${pad(date.getDate())}`;}// 替代方案:使用Intl.DateTimeFormatconst formatter = new Intl.DateTimeFormat('zh-CN', {year: 'numeric',month: '2-digit',day: '2-digit'});formatter.format(new Date()); // "2023/01/01"(需处理斜杠)
三、数组高级操作
3.1 数组差异比较
找出两个数组的差异元素时,Set数据结构可显著提升性能:
function arrayDifference(arr1, arr2) {const set2 = new Set(arr2);return arr1.filter(x => !set2.has(x));}// 双向差异function fullDifference(a, b) {const setA = new Set(a);const setB = new Set(b);return [[...a].filter(x => !setB.has(x)),[...b].filter(x => !setA.has(x))];}
性能对比:
- 传统双重循环:O(n²)
- Set方案:O(n)
- 适用于处理超过1000个元素的数组
3.2 数组分组统计
将数组按特定规则分组统计的实用方案:
const data = [{ category: 'A', value: 10 },{ category: 'B', value: 20 },{ category: 'A', value: 30 }];const grouped = data.reduce((acc, item) => {const key = item.category;acc[key] = (acc[key] || []).concat(item);return acc;}, {});// 结果: { A: [...], B: [...] }
进阶应用:配合Object.values()可直接获取分组后的数组:
const groupArray = Object.values(grouped);
四、字符串处理最佳实践
4.1 字符串首字母大写
实现标题格式化的多种方案:
// 方案1:字符串操作function capitalize(str) {return str.charAt(0).toUpperCase() + str.slice(1);}// 方案2:数组解构(ES6)function capitalize2([first, ...rest]) {return first.toUpperCase() + rest.join('');}// 方案3:正则表达式function capitalize3(str) {return str.replace(/^./, match => match.toUpperCase());}
性能测试:
- 短字符串(<20字符):方案2最快
- 长字符串:方案3性能最优
4.2 字符串CSV转换
将二维数组转换为CSV格式的健壮实现:
function arrayToCSV(data, delimiter = ',') {return data.map(row =>row.map(cell =>`"${String(cell).replace(/"/g, '""')}"`).join(delimiter)).join('\n');}// 使用示例const csvData = [['Name', 'Age'],['Alice, "Bob"', 25]];console.log(arrayToCSV(csvData));
关键处理:
- 字段值用双引号包裹
- 内部双引号转义为两个双引号
- 自动处理包含分隔符的字段
五、数据验证与安全处理
5.1 JSON有效性检查
安全解析JSON字符串的推荐模式:
function safeParseJSON(jsonString) {try {return { success: true, data: JSON.parse(jsonString) };} catch (e) {return { success: false, error: e.message };}}// 使用示例const result = safeParseJSON('{"invalid": "json"');if (!result.success) {console.error('JSON解析失败:', result.error);}
安全建议:
- 永远不要使用
eval()解析JSON - 生产环境建议添加JSON大小限制
- 考虑使用
JSON.parse()的reviver函数进行深度验证
5.2 输入数据消毒
防止XSS攻击的字符串消毒函数:
function sanitizeInput(input) {const div = document.createElement('div');div.textContent = input;return div.innerHTML;}// 更严格的方案(需引入DOMPurify等库)function strictSanitize(input) {// 实际项目中应使用专业库return input.replace(/<[^>]*>/g, '');}
六、性能优化技巧
6.1 数组操作性能对比
常见数组方法的性能特征:
| 方法 | 时间复杂度 | 适用场景 |
|———|—————|—————|
| push() | O(1) | 数组末尾添加 |
| unshift() | O(n) | 数组头部添加 |
| splice() | O(n) | 中间插入/删除 |
| concat() | O(n) | 数组合并 |
6.2 内存管理建议
- 避免在循环中创建函数
- 及时解除不再使用的事件监听
- 使用对象池模式处理高频创建的对象
- 对于大型数组,考虑使用TypedArray
七、现代JavaScript特性应用
7.1 可选链操作符
简化深层属性访问的安全方案:
// 传统方案const street = user && user.address && user.address.street;// 现代方案const street = user?.address?.street;
7.2 空值合并操作符
提供默认值的简洁写法:
// 传统方案const value = input !== undefined ? input : defaultValue;// 现代方案const value = input ?? defaultValue;
本文提供的解决方案均经过实际项目验证,开发者可根据具体场景选择最适合的方案。建议结合ESLint等工具规范代码风格,并定期进行性能测试以确保最优实现。对于复杂业务场景,推荐使用Lodash等专业工具库,它们提供了经过充分测试的实用函数集合。