【问题标题】:JavaScript: How can I transform objects array A to objects array B in the efficiency way? [closed]JavaScript:如何以高效的方式将对象数组 A 转换为对象数组 B? [关闭]
【发布时间】:2016-08-11 03:56:55
【问题描述】:

我得到了对象数组 A:

[
    {
        "Timestamp": "2015-10-01 00:00:00",
        "Label": "Voltage",
        "Value": "230.12"
    },
    {
        "Timestamp": "2015-10-01 00:00:00",
        "Label": "Frequency",
        "Value": "50.12"
    },
    {
        "Timestamp": "2015-10-01 00:00:00",
        "Label": "Power",
        "Value": "23"
    },
    {
        "Timestamp": "2015-10-02 22:22:22",
        "Label": "Voltage",
        "Value": "231.12"
    },
    {
        "Timestamp": "2015-10-02 22:22:22",
        "Label": "Frequency",
        "Value": "51.12"
    },
    {
        "Timestamp": "2015-10-02 22:22:22",
        "Label": "Power",
        "Value": "23.4"
    }
]

我想像这样转换为对象数组 B:

[
    {
        "Timestamp": "2015-10-01 00:00:00",
        "Voltage": "230.12",
        "Frequency": "50.12",
        "Power": "23"
    },
    {
        "Timestamp": "2015-10-02 22:22:22",
        "Voltage": "231.12",
        "Frequency": "51.12",
        "Power": "23.4"
    }
]

我正在循环获取时间戳并再次重新循环以获取标签和值以形成新的对象数组。它可以工作,但是当数据变成几十万个对象数组时,效率不高,浏览器崩溃。请问有人能想出更好的方法吗。非常感谢。

【问题讨论】:

  • 为什么要将不同时间戳(2015-10-02 22:22:22 和 2015-10-02 00:00:00)的数据放在一起?
  • 您的输入是否按时间戳排序?如果是的话,一次运行就很简单了。
  • 请详细解释您的功能。你是如何制作数组 B 的?
  • ...如果没有,a) 对其进行排序或 b) 使用 Map 快速查找数据。
  • 投票结束这个过于宽泛,因为您没有在问题中提供任何代码来显示 what you've tried 并且没有提出比工作订单更重要的具体问题。

标签: javascript arrays json sorting


【解决方案1】:

JSON 只是一种传输/存储格式。通常不应该尝试直接操纵它。最好操作实际的 JavaScript 对象/数组。

如果你能保证原始数组排序顺序,试试这样:

var outputArray = [];
var currentObj = null;
originalArray.forEach(function (measurement) {
  if (!currentObj || currentTimestamp !== measurement.Timestamp) {
    currentTimestamp = measurement.Timestamp;
    currentObj = {
      Timestamp: measurement.Timestamp;
    }
    outputArray.push(currentObj);
  }
  currentObj[measurement.Label] = measurement.Value;
});

然后,您可以在执行过程中循环并构建新数组。

【讨论】:

  • 嗨,布拉德,你也成功了!你们和DAX脚本都比我好,非常感谢,今天我会用几十万数据测试它,让你们知道。再次感谢。 jsfiddle.net/51r7onnm
  • 令人惊讶的是,当我投入数十万个带有时间戳的数据点时,使用 foreach 和通用时间戳的响应速度比 array.reduce 方法快得多。而且 a b reduce 看起来非常简洁明了!老实说,当我看到 DAX 使用箭头函数时,它对我来说是相当先进的。非常感谢你!你们真是天才!我从你的 sn-p 身上学到了很多。
【解决方案2】:

由于您所需的输出显示忽略时间戳的时间,这将修剪时间戳的那部分 - 如果这是问题中的错误,我认为您应该能够自己删除该部分

var b = a.reduce((acc, cur) => {
  var strippedTimestamp = cur.Timestamp.substring(1, 10) + " 00:00:00";
    var obj = acc.find(e => e.Timestamp == strippedTimestamp);
  if (!obj) {
    obj = { Timestamp: strippedTimestamp };
    acc.push(obj);
  }
  obj[cur.Label] = cur.Value;
  return acc;
}, []);

会输出

[
    {
        "Timestamp": "015-10-01 00:00:00",
        "Voltage": "230.12",
        "Frequency": "50.12",
        "Power": "23"
    },
    {
        "Timestamp": "015-10-02 00:00:00",
        "Voltage": "230.12",
        "Frequency": "50.12",
        "Power": "23"
    }
]

【讨论】:

  • 感谢 DAX,您的代码对我有用,但我删除了剥离的时间戳。抱歉,这是我关于时间戳的拼写错误,是的,机器向我返回带有时间戳的每个数据点,但前端显示器希望按时间戳将它们组合在一起。 jsfiddle.net/ow2d6f72
猜你喜欢
  • 2018-12-21
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2019-02-09
  • 1970-01-01
  • 2019-10-22
  • 2019-04-06
相关资源
最近更新 更多