JavaScript项目:合并含dps的JSON数组出错,求正确实现方案
合并两个JSON数组的dps数据为指定格式的解决方案
你的代码存在几个明显的问题,导致输出结果不符合预期,我来帮你梳理并修正:
原代码的问题分析
- 未定义变量与错误引用:代码里的
data变量并未定义,你需要分别从one和two这两个数组中提取dps对象,而非假设它们在一个data数组里。 - 冗余的嵌套循环:两层
for...in循环会让每个时间键被重复添加多次(次数等于键的总数),这完全是没必要的冗余操作。 - 值的错误复用:你在
push时两次使用了getVal[i],意味着两个数值都来自第二个数组,根本没有取到第一个数组的对应值。 - 不符合需求的日期处理:你把时间戳转成了
Date对象,但你想要的输出是原始的数字时间戳格式。
正确的实现代码
下面是针对你需求的修正版代码,适配两个dps对象键完全一致的场景(也就是你给出示例的情况):
var one = [{ "dps": { "1516624200": 0.03333333333333333, "1516624800": 0.88, "1516625400": 0.0, "1516626000": 0.0, "1516626600": 0.0, "1516627200": -0.012962962962963048, "1516627800": -0.022390572390572364, "1516628400": 20.37605723905724, "1516629000": 80.06746296296296, "1516629600": 94.12977777777778, "1516630200": 94.11733333333332, "1516630800": 94.1302777777778, "1516631400": 94.19999999999995 } }]; var two = [{ "dps": { "1516624200": 0.2, "1516624800": 0.95, "1516625400": 0.0, "1516626000": 0.0, "1516626600": 0.0, "1516627200": -0.55, "1516627800": -0.6, "1516628400": 20.77, "1516629000": 8296296296, "1516629600": 99, "1516630200": 99, "1516630800": 55, "1516631400": 94.19999999999995 } }]; // 分别提取两个数组中的dps对象 const dpsFromOne = one[0].dps; const dpsFromTwo = two[0].dps; // 获取所有时间戳键(假设两个dps的键完全一致) const timeStamps = Object.keys(dpsFromOne); // 遍历键,构建目标格式的数组 const graphData = timeStamps.map(timestamp => { // 将字符串类型的时间戳转为数字,然后依次取两个dps对应的值 return [Number(timestamp), dpsFromOne[timestamp], dpsFromTwo[timestamp]]; }); console.log(graphData);
扩展:处理键不一致的情况
如果两个dps对象的时间戳键可能存在差异,你可以先合并所有键,再进行处理,确保不会遗漏任何数据:
// 合并两个dps的所有时间戳键,并去重排序 const allTimeStamps = [...new Set([...Object.keys(dpsFromOne), ...Object.keys(dpsFromTwo)])].sort(); const graphData = allTimeStamps.map(timestamp => { // 对于不存在的键,可以返回null或者默认值,根据你的需求调整 return [ Number(timestamp), dpsFromOne[timestamp] ?? null, dpsFromTwo[timestamp] ?? null ]; });
这样就能得到你想要的[[时间戳, 第一个数组对应值, 第二个数组对应值], ...]格式的结果了。
内容的提问来源于stack exchange,提问作者Karan
相关产品推荐
相关产品推荐

