繁体   English   中英

Javascript 排序 object 关键指标

[英]Javascript sort object key indexes

这是我的结构/示例:

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”排序为 object,但有时也作为“obj2”进行排序。

我的问题:

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

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

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

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

在此先感谢您的任何建议或帮助。javascri

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

这种方法对所有对象采用所需的顺序。

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

// call
iterate(object1, arrWeekdays);

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

无论如何,如果您真的想按特定顺序放置这些属性,则必须按所需顺序创建一个新的 object。 请记住,此顺序不是永久性的,很可能会发生变化。

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

按值对 object 属性进行排序中所述

我们可以使用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);

即使属性以正确的顺序插入,您仍然不能(或不应该)依赖它。 但是你绝对可以实现你自己的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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM