JavaScript 数组如何合并到头部。
考察下面的代码:
const headers = ['Date', 'Time', 'Action', 'Process', 'Details', 'Editor', 'Network Address'];
return [date, time, action, '', details, '', meta];
});
要求是把 header 合并到前面去。
想将 headers 数组作为第一行,然后后面跟着 items 数组中的所有数据,形成一个大的二维数组,通常用于准备 CSV 或表格数据。
有几种方法可以实现这个合并:
方法 1: 使用 concat() 方法
concat() 是最直接的方法,它会将两个数组连接起来并返回一个新数组。
const headers = ['Date', 'Time', 'Action', 'Process', 'Details', 'Editor', 'Network Address'];
const items = Array.from(timeline.querySelectorAll('.timeline-item')).map(item => {
const date = item.getAttribute('data-audit-date') || '';
const time = item.querySelector('.timeline-time')?.textContent.trim() || '';
const action = item.querySelector('.timeline-title')?.textContent.trim() || '';
const details = item.querySelector('.timeline-description')?.textContent.trim() || '';
const meta = item.querySelector('.timeline-meta')?.textContent.trim() || '';
// 确保每个 item 数组的长度与 headers 匹配,即使某些字段为空。
// 这里 Process 和 Editor 字段是空的,与 headers 对应。
return [date, time, action, '', details, '', meta];
});
// 将 headers 数组放在 items 数组前面
const dataForExport = [headers].concat(items);
console.log(dataForExport);
// 结果示例 (假设 items 中有一些数据):
// [
// ['Date', 'Time', 'Action', 'Process', 'Details', 'Editor', 'Network Address'],
// ['2023-10-26', '10:00', '用户登录', '', '成功登录系统', '', '192.168.1.100'],
// ['2023-10-26', '10:05', '修改配置', '', '更改了设置A', '', '192.168.1.100']
// ]
解释:
[headers]将headers数组包装成一个包含单个数组元素的数组。[headers].concat(items)这样就可以将headers数组作为第一个元素,然后后面跟着items数组中的所有子数组。
方法 2: 使用扩展运算符 (...)
扩展运算符提供了一种更简洁的语法。
const headers = ['Date', 'Time', 'Action', 'Process', 'Details', 'Editor', 'Network Address'];
const items = Array.from(timeline.querySelectorAll('.timeline-item')).map(item => {
const date = item.getAttribute('data-audit-date') || '';
const time = item.querySelector('.timeline-time')?.textContent.trim() || '';
const action = item.querySelector('.timeline-title')?.textContent.trim() || '';
const details = item.querySelector('.timeline-description')?.textContent.trim() || '';
const meta = item.querySelector('.timeline-meta')?.textContent.trim() || '';
return [date, time, action, '', details, '', meta];
});
// 将 headers 数组作为第一个元素,然后展开 items 数组
const dataForExport = [headers, ...items];
console.log(dataForExport);
// 结果与上面相同
解释:
[headers, ...items]创建一个新数组。headers直接作为新数组的第一个元素(一个数组)。...items将items数组中的所有子数组“展开”并作为新数组的后续元素添加。
哪种方法更好?
两种方法都非常有效,并且最终结果相同。
- 扩展运算符 (
...) 通常被认为是现代 JavaScript 中更简洁、更可读的方法,尤其是在创建新数组时。 concat()方法同样清晰,并且在旧版浏览器中可能具有更好的兼容性(尽管现代浏览器都支持扩展运算符)。
在您提供的场景中,两种方法都非常适合。我个人会倾向于使用扩展运算符,因为它更短、更直观。