【问题标题】:Javascript sort object key indexesJavascript 排序对象键索引
【发布时间】:2021-02-17 09:57:58
【问题描述】:

这是我的结构/示例:

let arrWeekdays = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'];

let obj1 = {
 'Montag' : ['test string'],
 'Dienstag' : ['test string'],
 'Mittwoch' : ['test string'],
 'Donnerstag' : ['test string'],
 'Freitag' : ['test string'],
 'Samstag' : ['test string']
}

let obj2 = {
 'Donnerstag' : ['test string'],
 'Samstag' : ['test string'],
 'Montag' : ['test string'],
 'Dienstag' : ['test string'],
 'Mittwoch' : ['test string'],
 'Freitag' : ['test string']
}


for ( key in objWeekdays ) {
  // do something
}

for in 循环中的“objectWeekdays”有时是有序对象为“obj1”,但有时也无序为“obj2”。

我的问题:

for in with obj1 => "Montag" 的键索引为 0

for in with obj2 => "Montag" 的键索引是 2

有没有办法在“for in”循环之前对对象键进行排序?

我希望总是在 for in 循环中以“Montag”开头。

提前感谢任何建议或 help.javascri

【问题讨论】:

  • 只是因为我很好奇:您为什么需要按顺序排列属性?

标签: javascript sorting object


【解决方案1】:

您可以迭代工作日数组并检查该属性是否存在以进行进一步处理。

这种方法对所有对象采取想要的顺序。

function iterate(object, days) {
    for (const day of days) {
        if (!(day in object)) continue;
        console.log(object[day]);       // processing
    }
}

// call
iterate(object1, arrWeekdays);

【讨论】:

  • 这不是我的问题。我已经知道所有属性都存在。但有时它们在“for in”循环中带有不同的索引。我想对 Object 中的键进行排序。
  • 不建议依赖对象属性的顺序,因为它们有一个定义的顺序,这可能不是想要的顺序。要获得具有所需顺序的对象,您需要按所需顺序重建对象。
  • 谢谢,我会这样做的。我认为可以对定义的顺序进行排序。
【解决方案2】:

简短回答:您无法“排序”它们,因为根本没有必要这样做。

无论如何,如果您真的想按特定顺序放置这些属性,则必须创建一个具有所需顺序的新对象。 记住这个顺序不是永久性的,很可能会改变。

对象属性的顺序在 ECMAScript 中是非标准的。你永远不应该对 JavaScript 对象中元素的顺序做出假设。对象是属性的无序集合。下面的答案向您展示了如何在数组的帮助下“使用”排序的属性,但从未真正改变对象本身的属性顺序。所以,不,这是不可能的。即使您构建具有预排序属性的对象,也不能保证它们将来会以相同的顺序显示。

Sorting object property by values 中所述。

【讨论】:

    【解决方案3】:

    我们可以使用 Object.entries 获取 obj2 的条目,对它们进行排序,然后使用 Object.fromEntries 重新创建它。

    一个人通常非常小心地依赖于属性顺序。这取决于属性创建顺序。如果您希望以这种方式迭代属性,最好获取一个键/条目数组,对它们进行排序,然后进行迭代。

    let obj2 = {
     'Donnerstag' : ['test string'],
     'Samstag' : ['test string'],
     'Montag' : ['test string'],
     'Dienstag' : ['test string'],
     'Mittwoch' : ['test string'],
     'Freitag' : ['test string']
    }
    
    let entries = Object.entries(obj2);
    entries.sort(([key1, v1], [key2, v2]) => key1.localeCompare(key2));
    let obj2Sorted = Object.fromEntries(entries);
    console.log("Obj2, sorted:", obj2Sorted);

    【讨论】:

      【解决方案4】:

      即使属性以正确的顺序插入,您仍然不能(或不应该)依赖它。但是你绝对可以实现你自己的iterator,这是一个人为的例子:

      // object of days; not in "human" order
      const days = {
        wed: 3,
        sat: 6,
        mon: 1,
        sun: 7,
        fri: 5,
        tue: 2,
        thu: 4
      };
      
      days[Symbol.iterator] = function* () {
        yield this.mon;
        yield this.tue;
        yield this.wed;
        yield this.thu;
        yield this.fri;
        yield this.sat;
        yield this.sun;
      };
      
      
      for (d of days) {
        console.log('for..of', d);
      }
      
      console.log('...days', ...days);

      【讨论】:

        猜你喜欢
        • 2011-07-24
        • 1970-01-01
        • 2015-06-19
        相关资源
        最近更新 更多