将含时间戳的数组转换为自定义键对象并格式化日期用于图表
解决数组转对象并格式化日期的问题
我来帮你搞定这个需求!先看看你现有代码里的几个小问题,然后给你完整的解决方案:
现有代码的问题点
new Date("time")这里写错了:你应该用数组里的时间戳(第一个元素)来创建日期对象,而不是字符串"time"- 最后一行的
Objec...应该是Object.assign({}, ...keyValues),用来把多个零散的键值对象合并成一个完整对象 - 直接用
{...arr}把数组转成对象虽然可行,但用reduce来处理会更高效简洁
完整解决方案(推荐用reduce)
这个方案会在数组转对象的同时,直接完成日期格式化,一步到位:
// 你的原始数据数组 const arr = [1524314460000, 0.067872, 0.067876, 0.067876, 0.06785, 0.41500986]; // 定义数组索引和目标对象键的映射关系 const keyMapping = { 0: "time", 1: "open", 2: "low", 3: "high", 4: "close", 5: "volume" }; // 把时间戳格式化为图表友好的日期格式(可按需调整) function formatChartDate(timestamp) { const date = new Date(timestamp); // 示例格式:YYYY-MM-DD HH:mm,适合大多数图表展示 return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}`; } // 核心转换函数:数组转带指定键的对象,同时格式化日期 function transformArrayToChartObject(arr, keyMap) { return arr.reduce((finalObj, value, index) => { const targetKey = keyMap[index] || index; // 对time字段单独做格式化,其他字段直接保留原值 finalObj[targetKey] = targetKey === "time" ? formatChartDate(value) : value; return finalObj; }, {}); } // 执行转换并查看结果 const chartDataObj = transformArrayToChartObject(arr, keyMapping); console.log(chartDataObj);
修正你原来的renameKeys函数的版本
如果你更想用自己最初的思路,也可以修正renameKeys函数来实现:
const arr = [1524314460000, 0.067872, 0.067876, 0.067876, 0.06785, 0.41500986]; const obj = {...arr}; const newKeys = {0: "time", 1: "open", 2:"low",3:"high",4:"close",5:"volume" }; // 同样需要日期格式化函数 function formatChartDate(timestamp) { const date = new Date(timestamp); return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`; } function renameKeys(obj, newKeys) { // 用Object.assign合并所有键值对,同时处理日期格式化 return Object.assign({}, ...Object.keys(obj).map(key => { const newKey = newKeys[key] || key; const processedValue = newKey === "time" ? formatChartDate(obj[key]) : obj[key]; return { [newKey]: processedValue }; })); } const result = renameKeys(obj, newKeys); console.log(result);
两种方法都能得到你想要的结果,其中reduce的方式代码更紧凑,性能也更好哦。
内容的提问来源于stack exchange,提问作者Ahmed Brahimi




