【问题标题】:How to convert a Java Hashmap to a javascript array properly如何正确将 Java Hashmap 转换为 javascript 数组
【发布时间】:2019-04-26 13:25:55
【问题描述】:

我想将 Java HashMap 转换为 javascript 数组,其中键位于 javascript 对象内。

我已尝试将 JSON 转换为带有数组的 javascript 对象。 Java Map 看起来像这样

我想从 Java 对象 (JSON) 转换为 javascript 数组的对象的快速概览。

export class Order extends Base {
    public createdAt: Date;
    public status: OrderStatus;
    public rounds: Round[];
}
export class Round extends Base {
  public lockable: boolean;
  public locked: boolean;
  public sequence: number;
  public createdAt: string;
  public orderedItems?: Item[];
}

我从服务器收到的 JSON:

[
  {
    "id": "87921b20-232d-4e13-8154-5ecdcdfeea83",
    "createdAt": 1556284343924,
    "status": "UNPAID",
    "rounds": {
      "1": {
        "id": "ffd791b7-3575-4653-9e65-0d95ed027d37",
        "createdAt": 1556284343930,
        "lockable": false,
        "locked": false,
        "orderedItems": []
      },
      "2": {
        "id": "310bbdff-2c41-4e22-96da-46282e158b49",
        "createdAt": 1556284343936,
        "lockable": true,
        "locked": false,
        "orderedItems": []
      }
    }
  }
]

现在我想做的事情如下。我认为在javascript中不能保证数组的顺序,所以我想在从API获取它之后在对象中添加id。

"2": <-- MOVE SEQUENCE inside the object like:
{
    ...
    "sequence": "2"
}

我在javascript中找不到像这样的其他解决方案,但希望您能给我一个更合适的解决方案:

order.forEach(o => {
       const rounds = [];
       Object.keys(o.rounds).forEach(key => {
            o.rounds[key].sequence = key;
            rounds.push(o.rounds[key]);
       });
       o.rounds = rounds;
});

【问题讨论】:

  • “我从服务器收到的 JSON”:什么服务器?你能控制它吗?

标签: javascript java hashmap


【解决方案1】:

您收到的 JSON 不包含 Rounds 的数组;正如您所观察到的,它包含一张地图。查看序列化到这个 JSON 的任何内容并更正它以使 JSON 看起来像这样会更清晰

[
  {
    ...
    "rounds": [
      {
        "id": "ffd791b7-3575-4653-9e65-0d95ed027d37",
        "createdAt": 1556284343930,
        "lockable": false,
        "locked": false,
        "orderedItems": []
      },
      {
        "id": "310bbdff-2c41-4e22-96da-46282e158b49",
        "createdAt": 1556284343936,
        "lockable": true,
        "locked": false,
        "orderedItems": []
      }
    ]
  }
]

但如果你真的需要,你可以这样做:

var out = []
for(var key in obj) {
    out[key] = obj[key]
}

您说:“我认为在 javascript 中不能保证数组的顺序”。数组肯定是用 Javascript 排序的。你可能在想一些不是数组的东西?因此,我认为向数组的每个成员添加 sequence 属性没有什么价值。

不过,如果你真的想要,这很简单:

var out = [];
for(var key in obj) {
    out[key] = m[key]
    out[key].sequence = key        
}

这确实都依赖于所有都是数字的键,或者可以强制转换为数字。

【讨论】:

    【解决方案2】:

    您可以通过使用Object.values() 来迭代order.rounds 的值,然后映射数组以在数组的每个对象中包含sequence 属性来简化它。

    const order = [{
      "id": "87921b20-232d-4e13-8154-5ecdcdfeea83",
      "createdAt": 1556284343924,
      "status": "UNPAID",
      "rounds": {
        "1": {
          "id": "ffd791b7-3575-4653-9e65-0d95ed027d37",
          "createdAt": 1556284343930,
          "lockable": false,
          "locked": false,
          "orderedItems": []
        },
        "2": {
          "id": "310bbdff-2c41-4e22-96da-46282e158b49",
          "createdAt": 1556284343936,
          "lockable": true,
          "locked": false,
          "orderedItems": []
        }
      }
    }];
    
    order.forEach(o => {
      const res = Object.values(o.rounds).map((object, index) => {
        object['sequence'] = index + 1;
        return object;
      });
      console.log(res)
    });

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 2019-12-06
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多