javascript - 防止 Javascript 重新排序 JSON

标签 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"
}

{
  "6": "Business Email",
  "1000005": "Deliver To Email",
  "7": "Personal Email"
}

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


选择手机:

enter image description here


已选择电子邮件:

enter image description here


但是,正如您在图片中看到的,列表项的顺序没有被保留。

我处理列表项的 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));
    }
  }

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

我尝试将 JSON 更改为新 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);

但是它抛出了一个错误:

TypeError: options_1 is not iterable

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

注意:我的 JSON 来自 Spring Controller ,它在 JSON 中“包装” map 以发送到 View 。但如果有更明智的方法将 map 从 Controller 传输到 View ,我可以修改 Controller 。

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

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

如果需要我可以修改。

最佳答案

您的 JSON 映射是键值对,无法保留键的顺序。您可以将 JSON 映射转换为数组保持顺序。

代替这个 JSON:

{
  "6": "Business Email",
  "1000005": "Deliver To Email",
  "7": "Personal Email"
}

发送这个 JSON:

[
  {"id": 6, "text": "Business Email"},
  {"id": 1000005, "text": "Deliver To Email"},
  {"id": 7, "text": "Personal Email"}
]

关于javascript - 防止 Javascript 重新排序 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54368006/

相关文章:

javascript - Angular ng-bind-html - 防止执行 JS 代码

python - 使用 read_json 函数将 json 行规范中的 json 转换为 panda?

c# - 我可以创建一个仅包含对象类型的空值的 JSON 示例吗?

javascript - 绑定(bind)方法不起作用

javascript - 为什么我的指定表格没有被退回?

javascript - 如何将表单中的数据正确插入到表中

ruby - 在 Ruby 中,MongoDB 返回一个 BSON::OrderedHash。如何将其转换为 JSON?使用 to_json 会出现 "stack level too deep"错误

javascript - 在 javascript 中测量 websockets 数据输入/输出的大小

JavaScript json分割对象并更新

javascript - iframe DOM 覆盖