使用javascript按键值对json对象进行排序

时间:2020-12-24 17:54:17

标签: javascript arrays json sorting

我正在尝试按键对 json 对象进行排序,但键有时包含一个数组,因此它对数据的排序不正确。我的函数的问题:它不比较数组的索引,我只想按完整键对数据进行排序。

低于错误的输出结果。

const byKey = o =>
 Object.keys(o)
   .sort()
   .reduce((r, k) => ((r[k] = o[k]), r), {});

错误输出结果

{
  "admin.name":"Okdaro fripi:",
  "amazon.token":"kqjndkJQNDjkmdnJKQDNKmjdqnmjdnQKMD",
  "data.content":"ABCD",
  "dimitro.job":"create",
  "person.account.email[0].card[0]":"VISA",
  "person.account.email[0].firstname":"George Blaksar",
  "person.account.email[0].org":"gmail",
  "person.account.email[10].card[0]":"yalla",
  "person.account.email[10].firstname":"qabte",
  "person.account.email[10].org":"amazon",
  "person.account.email[1].card[0]":"Master card",
  "person.account.email[1].firstname":"balbi",
  "person.account.email[1].org":"yahoo",
  "person.account.email[2].card[0]":"payoneer",
  "person.account.email[2].firstname":"pinaro",
  "person.account.email[2].org":"facebook",
...
  "person.account.email[9].card[0]":"yalla",
  "person.account.email[9].firstname":"qabte",
  "person.account.email[9].org":"amazon",
  "zend.port":99
}

低于我想要的

{
 "admin.name": "Okdaro fripi:",
 "amazon.token": "kqjndkJQNDjkmdnJKQDNKmjdqnmjdnQKMD",
 "data.content": "ABCD",
 "dimitro.job": "create",
 "person.account.email[0].card[0]": "VISA",
 "person.account.email[0].firstname": "George Blaksar",
 "person.account.email[0].org": "gmail",
 "person.account.email[1].card[0]": "Master card",
 "person.account.email[1].firstname": "balbi",
 "person.account.email[1].org": "yahoo",
 "person.account.email[2].card[0]": "payoneer",
 "person.account.email[2].firstname": "pinaro",
 "person.account.email[2].org": "facebook",
 "person.account.email[3].card[0]": "aws",
 "person.account.email[3].firstname": "zartb",
 "person.account.email[3].org": "amazon",
 "person.account.email[4].card[0]": "Master card 4",
 "person.account.email[4].firstname": "blinago ",
 "person.account.email[4].org": "yahoo",
 "person.account.email[5].card[0]": "lbl",
 "person.account.email[5].firstname": "tarficana",
 "person.account.email[5].org": "netflix",
 "person.account.email[6].card[0]": "yalla",
 "person.account.email[6].firstname": "qabte",
 "person.account.email[6].org": "amazon",
 "person.account.email[7].card[0]": "Master card 4",
 "person.account.email[7].firstname": "blinago ",
 "person.account.email[7].org": "yahoo",
 "person.account.email[8].card[0]": "lbl",
 "person.account.email[8].firstname": "tarficana",
 "person.account.email[8].org": "netflix",
 "person.account.email[9].card[0]": "yalla",
 "person.account.email[9].firstname": "qabte",
 "person.account.email[9].org": "amazon",
  "person.account.email[10].card[0]": "yalla",
 "person.account.email[10].firstname": "qabte",
 "person.account.email[10].org": "amazon",
 "zend.port": 99
}

1 个答案:

答案 0 :(得分:0)

您可以使用 String#localeCompare 并使用按字符串组排序的 options 对键进行排序。

const
    object = {
        "admin.name": "Okdaro fripi:",
        "amazon.token": "kqjndkJQNDjkmdnJKQDNKmjdqnmjdnQKMD",
        "data.content": "ABCD",
        "dimitro.job": "create",
        "person.account.email[0].card[0]": "VISA",
        "person.account.email[0].firstname": "George Blaksar",
        "person.account.email[0].org": "gmail",
        "person.account.email[10].card[0]": "yalla",
        "person.account.email[10].firstname": "qabte",
        "person.account.email[10].org": "amazon",
        "person.account.email[1].card[0]": "Master card",
        "person.account.email[1].firstname": "balbi",
        "person.account.email[1].org": "yahoo",
        "person.account.email[2].card[0]": "payoneer",
        "person.account.email[2].firstname": "pinaro",
        "person.account.email[2].org": "facebook",
        "person.account.email[9].card[0]": "yalla",
        "person.account.email[9].firstname": "qabte",
        "person.account.email[9].org": "amazon",
        "zend.port": 99
    };

console.log(Object.fromEntries(Object
    .entries(object)
    .sort(([a], [b]) => a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' })))
);
.as-console-wrapper { max-height: 100% !important; top: 0; }

相关问题