【问题标题】:Object.keys but not in order JS / TSObject.keys 但不按 JS / TS 顺序
【发布时间】:2020-07-25 22:52:31
【问题描述】:


我有一个问题:我有这个 JSON =>

const json = {
  "test" : "...",
  "3" : "...",
  "go" : "...",
  "38" : "..."
}

当我这样做时:

const returned = Object.keys(json);

返回里面有这个:

3,38,go,test

按字母顺序!我只希望以“经典”顺序返回
你有解决办法吗?

【问题讨论】:

  • 这是不可能的。
  • 看起来关于密钥顺序的信息没有存储在任何地方stefanjudis.com/today-i-learned/…
  • 2ality.com/2015/10/… 可能有用。在 Chrome 中,Reflect.ownKeys(json) 给了我 ["3","38","test","go"]
  • Object.keys一样。
  • 是的:我的意思是指出顺序显然是固定的,但是整数首先出现,然后按时间顺序排列字符串......所以问题显然只是因为整数 -类似字符串。 “test”和“go”也与 OP 的“go”和“test”相反。根据具体情况,这个问题可能已经解决了一半。

标签: javascript json angular typescript


【解决方案1】:

如果插入顺序很重要,请使用地图

如果插入顺序很重要,请使用Map(),地图将根据规范保留插入顺序。

演示

let map = new Map();
map.set('test', '...');
map.set('3', '...');
map.set('go', '...');
map.set('38', '...');

for( key of map.keys() )
  console.log( key )

【讨论】:

    【解决方案2】:

    如果您可以容忍在 json 中的整数键上有前导零,您可以让它像这样工作:

    const json = {
      "test" : "...",
      "03" : "...",
      "go" : "...",
      "038" : "..."
    }
    console.log(Object.keys(json))   //  ["test", "03", "go", "038"] in Chrome at least

    文章here 解释了对象键的顺序。本质上,整数和类似整数的字符串排在字符串之前,但字符串按时间顺序排列(插入顺序)。如果您在(字符串)整数上加上前导零,则出于排序目的,它将被视为字符串,而不是整数。

    我认为这种行为依赖于 JS 引擎,但我认为是在 ES6 中指定的。

    【讨论】:

      【解决方案3】:

      您可以使用Map 对象按插入顺序遍历键。正如 MDN 文档所说,

      Map 对象保存键值对并记住键的原始插入顺序。任何值(对象和原始值)都可以用作键或值。 …… for...of 循环为每次迭代返回一个 [key, value] 数组。

      【讨论】:

        【解决方案4】:

        您可以使用小技巧,将+ 添加到对象数字键,如下所示,然后再次将它们转换为数字:

        const json = {
          test: "...",
          "+3": "...",
          go: "...",
          "+38": "...",
        };
        
        for (let key in json) {
          let value = json[key];
          if (key[0] === "+") {
            key = +key;
          }
        
          console.log(key + ": " + value);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-23
          • 1970-01-01
          • 1970-01-01
          • 2020-11-26
          相关资源
          最近更新 更多