阻止Javascript重新排序JSON

ryv*_*age 1 javascript json

我有这两个JSON地图:

{
  "1000006": "Alternate Business Phone",
  "1000008": "Alternate Home Phone",
  "1000001": "Business Phone",
  "1000003": "Clinic Phone",
  "3": "Facsimile",
  "1000007": "Home Phone",
  "1000004": "Lab Phone",
  "4": "Pager",
  "1000002": "Secure Msg Phone"
}
Run Code Online (Sandbox Code Playgroud)

和

{
  "6": "Business Email",
  "1000005": "Deliver To Email",
  "7": "Personal Email"
}
Run Code Online (Sandbox Code Playgroud)

哪些是按值按字母顺序排列的键值映射.我正在使用这两个来根据另一个下拉列表的选定项目更改下拉菜单的内容.图片来说明:


电话选择:

在此输入图像描述


电邮选择:

在此输入图像描述


但是,正如您在图像中看到的那样,列表项的顺序不会被保留.

处理列表项的我的Javascript是这样的:

  var options_1 = {"1000006":"Alternate Business Phone","1000008":"Alternate Home Phone","1000001":"Business Phone","1000003":"Clinic Phone","3":"Facsimile","1000007":"Home Phone","1000004":"Lab Phone","4":"Pager","1000002":"Secure Msg Phone"};
  var options_2 = {"6":"Business Email","1000005":"Deliver To Email","7":"Personal Email"};
  function changePhoneEmailItems()
  {
    var selectedItem = document.getElementById("addNewCategory").value;
    var options;
    if('1' === selectedItem) {
        options = options_1;
    } else {
        options = options_2;
    }
    var list = document.getElementById("addNewUsageType");
    list.options.length=0;
    for(var i in options) {
        list.add(new Option(options[i], i));
    }
  }
Run Code Online (Sandbox Code Playgroud)

根据StackOverflow的回答,我需要更改我正在使用的数据结构,因为根据定义,JSON是无序的.

我尝试将JSON更改为new Map:

var options_1 = {"1000006":"Alternate Business Phone","1000008":"Alternate Home Phone","1000001":"Business Phone","1000003":"Clinic Phone","3":"Facsimile","1000007":"Home Phone","1000004":"Lab Phone","4":"Pager","1000002":"Secure Msg Phone"};
var options_2 = {"6":"Business Email","1000005":"Deliver To Email","7":"Personal Email"};
var options_1_map = new Map(options_1);
console.log(options_1_map);
Run Code Online (Sandbox Code Playgroud)

但它引发了一个错误:

TypeError: options_1 is not iterable
Run Code Online (Sandbox Code Playgroud)

如何更改JSON对象以保留原始顺序?

注意:我的JSON来自Spring控制器,它以JSON"包装"地图以发送到视图.但是,如果有更合理的方法将地图从控制器传输到视图,我可以修改控制器.

编辑:为了更好地衡量,生成JSON的控制器代码是:

for(int i = 1; i <= 2; i++) {
    JsonObject json = new JsonObject();
    HashMap<String, String> CDCONTMETHTP = (HashMap<String, String>)model.get("CDCONTMETHTP_" + i);
    for(Entry<String, String> option : CDCONTMETHTP.entrySet()) {
        json.addProperty(option.getKey(), option.getValue());
    }
    model.put("options_" + i, json);
}
Run Code Online (Sandbox Code Playgroud)

如果需要,我可以修改.

Dav*_*vid 6

您的JSON映射是键值对,无法保留键的顺序.您可以将JSON映射转换为Arrays,这将保留顺序.

而不是这个JSON:

{
  "6": "Business Email",
  "1000005": "Deliver To Email",
  "7": "Personal Email"
}
Run Code Online (Sandbox Code Playgroud)

发送此JSON:

[
  {"id": 6, "text": "Business Email"},
  {"id": 1000005, "text": "Deliver To Email"},
  {"id": 7, "text": "Personal Email"}
]
Run Code Online (Sandbox Code Playgroud)