获取对象的第一个索引

IT技术 javascript javascript-objects
2021-02-08 23:18:25

考虑:

var object = {
  foo: {},
  bar: {},
  baz: {}
}

我将如何做到这一点:

var first = object[0];
console.log(first);

显然,这不起作用,因为第一个索引名为foo,而不是0

console.log(object['foo']);

有效,但我不知道它的名字是 foo。它可以命名为任何东西。我只想要第一个。

6个回答

只是为了好玩,这适用于 JS 1.8.5

var obj = {a: 1, b: 2, c: 3};
Object.keys(obj)[0]; // "a"

这与您看到的相同顺序匹配

for (o in obj) { ... }
澄清一下,根据en.wikipedia.org/wiki/JavaScript#Version_history JS 1.8.5 在 IE9 之前不受支持。不幸的是,许多人仍处于石器时代。
2021-03-19 23:18:25
100% 最佳答案。这是执行此操作的最简单和最快的方法。
2021-03-25 23:18:25
伟大的一个。简短而简单。谢谢@Jacob
2021-04-06 23:18:25
如果有人在使用 IE9 😏 我会感觉到他的痛苦。谢谢这太棒了
2021-04-07 23:18:25
除非需要石器时代的反向兼容性,否则显然是最佳选择。
2021-04-09 23:18:25

如果你想要一些简洁的尝试:

for (first in obj) break;

alert(first);

包装成一个函数:

function first(obj) {
    for (var a in obj) return a;
}
请参阅下面的 Luke Schafer 的回答,它使用 hasOwnProperty 方法来确保您不会获取原型成员。
2021-03-18 23:18:25
Object.keys(obj)[0];(0.072ms) 比for(1.644ms) 快得多。
2021-04-05 23:18:25
对于一个在所有浏览器(包括 IE8 及更低版本)中工作的单行代码,for (var key in obj) if (obj.hasOwnProperty(key)) break;您将需要使用该key变量
2021-04-07 23:18:25
如果第一个元素是对象类型,则不起作用。返回 0
2021-04-10 23:18:25

它们并不是真正订购的,但您可以这样做:

var first;
for (var i in obj) {
    if (obj.hasOwnProperty(i) && typeof(i) !== 'function') {
        first = obj[i];
        break;
    }
}

.hasOwnProperty()忽略原型的对象是很重要的。

@Napalm 他指的是正在检查的变量名称中的错误,而不是语法。你是对的,但很多人喜欢括号以提高可读性
2021-03-15 23:18:25
上面的代码有错误。typeof 检查应该是 typeof(i)
2021-03-17 23:18:25
谢谢你。太奇妙了。
2021-04-09 23:18:25

这不会给你第一个,因为 javascript 对象是无序的,但是在某些情况下这很好。

myObject[Object.keys(myObject)[0]]

如果对象的顺序很重要,您应该修改 JSON 模式以将对象存储在数组中:

[
    {"name":"foo", ...},
    {"name":"bar", ...},
    {"name":"baz", ...}
]

或许:

[
    ["foo", {}],
    ["bar", {}],
    ["baz", {}]
]

正如 Ben Alpert 指出的那样,Javascript 对象的属性是无序的,如果您希望它们按照在对象字面量中指定的相同顺序进行枚举,那么您的代码就会被破坏——没有“第一个”属性。

如果您知道对象只有一个元素,那么您就知道顺序。
2021-03-19 23:18:25
我从未见过 for(i in obj) 以不同的顺序做事,你是说有时 for(i in obj) 会以不同的顺序踢东西吗?
2021-04-02 23:18:25
它有可能会。规范说它不必按特定顺序枚举。这几乎意味着该顺序可能会改变。
2021-04-07 23:18:25
现在大多数浏览器都保留了插入顺序,但情况并非总是如此;它不是规范所要求的,并且有最新版本的 Chrome 没有保留插入顺序。
2021-04-07 23:18:25
随着我对我正在做的事情的深入了解,事情的顺序变得更加重要(我以为我只关心第一个,但我错了!)所以很明显按照你的建议将我的对象存储在数组中。
2021-04-10 23:18:25