如何正确地将Java Hashmap转换为javascript数组



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

我试图将 JSON 转换为内部带有数组的 JavaScript 对象。Java 映射看起来像这样<字符串:"序列",对象:圆形>

我要从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 后在对象中添加 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 不包含一个Round数组;正如你所观察到的,它包含一个地图。查看序列化到此 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        
}

这都依赖于键都是数字,或者强制到数字。

你可以通过使用

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)
});

最新更新