【问题标题】:How do i reverse JSON in JavaScript?如何在 JavaScript 中反转 JSON?
【发布时间】:2011-05-21 20:27:35
【问题描述】:
[
   {"task":"test","created":"/Date(1291676980607)/"},
   {"task":"One More Big Test","created":"/Date(1291677246057)/"},
   {"task":"New Task","created":"/Date(1291747764564)/"}
]

我看了这里,有人有同样的问题,但“检查”的正确答案是,如果删除该项目,在 IE 上会有所不同,这很好。我的问题是,上面的那些项目被存储了,但是当我去抓取它们,迭代并返回时,这些项目被颠倒了,created 位于0 索引处,task 位于1 处。另外,我需要将其作为 JSON 返回。

这是我的基本 JS(值 == 用户传入的 int):

outputJSON = {};
for(x in json[value]){
    outputJSON[x] = _objectRevival(json[value][x]);
}
return outputJSON;

返回:

created: Mon Dec 06 2010 15:09:40 GMT-0800 (Pacific Standard Time)
task: "test"

【问题讨论】:

    标签: javascript arrays json loops


    【解决方案1】:

    对象的属性顺序未定义。不可能以指定的顺序强制它们。如果您需要按特定顺序使用它们,则可以使用数组可靠地构建此结构:

    var values = [
       [["task", "test"],              ["created", "/Date(1291676980607)/"]],
       [["task", "One More Big Test"], ["created", "/Date(1291677246057)/"]],
       [["task", "New Task"],          ["created", "/Date(1291747764564)/"]]
    ];
    

    然后你可以像这样迭代你的结构:

    for (var i = 0; i < values.length; i++) {
        for (var k = 0; k < values[i]; k++) {
            // values[i][k][0] contains the label (index 0)
            // values[i][k][1] contains the value (index 1)
        }
    }
    

    【讨论】:

    • 如果您需要排序,您将不得不以不同的方式存储数据,例如作为二元素数组的数组或键/值对对象的数组。
    • @Matti Virkkunen:我在这里解决了一些不同的问题以节省内存。
    • OP并没有具体说明他是否提前知道所有的属性,或者顺序是否真的应该跟随数据,不管它是什么顺序。
    【解决方案2】:

    要为您的输出强制执行特定顺序,只需将您的 for 循环中的 json[value] 替换为您希望显示它们的顺序的对象属性数组,在您的情况下为 ["task", "created"]

    【讨论】:

      【解决方案3】:

      问题在于 javascript 对象不按特定顺序存储它们的属性。另一个数组可以(因此你可以从 json[0]、json[1]、json[2] 获得一致的东西)。

      如果您的对象将始终具有“任务”和“创建”,那么您可以按照您想要的任何顺序获取它们。

      json[value]["task"]
      

      json[value]["created"]
      

      更新: 这应该适用于您现有的代码。 发送json对象之前:

      var before = [
         {"task":"test","created":"/Date(1291676980607)/"},
         {"task":"One More Big Test","created":"/Date(1291677246057)/"},
         {"task":"New Task","created":"/Date(1291747764564)/"}
      ];
      var order = [];
      for (var name in before[0]) {
         order.push(name); // puts "task", then "created" into order (for this example)
      }
      

      然后将您的 json 发送到服务器。稍后当您从服务器取回数据时:

      var outputJSON = {};
      for (var x in order) {
         if (order.hasOwnProperty(x)) {
            outputJSON[order[x]] = _objectRevival(json[value][order[x]]); // I'm not sure what _objectRevival is...do you need it?
         }
      }
      return outputJSON;
      

      【讨论】:

      • 是的,我希望,但他们不会。那只是一个演示用例。他们可以存储任何东西。
      • 好的,那么在你存储对象之前,你能不能把它们的名字压入一个数组,以保持原来的顺序?然后当你拿回来时,根据数组的顺序读出它们(遍历数组,得到 json[value][array[i]] )。
      • _objectRevival() 使得如果存储的某些数据是 object,例如,如果用户放入 Date() 对象,它将其转换为 .getTime() 然后放入它在/Date(12345...)/_objectRevival() 中使其返回 成为Date() 或其他对象,或者,如果它不匹配预定义的对象,则只是我返回的对象。
      【解决方案4】:
      var items = ["bag", "book", "pen", "car"];
      items.reverse();
      

      这将导致以下输出:

      car , pen, book, bag
      

      即使你有 JSON 数组,它也会反转。

      【讨论】:

        猜你喜欢
        • 2012-04-08
        • 2019-01-17
        • 1970-01-01
        • 2012-10-03
        • 2015-03-29
        • 2020-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多