我有一个对象,我想访问该对象的第一个元素,所以首先,我需要获取该对象的第一个键。我有两种方法可以做到,但我正在寻找更好的方法。
第一个是:
var firstKey = Object.keys(myObject)[0];
但Object.keys
将返回所有键的数组。所以如果我只想要第一个键,这个方法对于我的任务来说太贵了(特别是如果myObject
有太多的键)。
第二种方法是:
var firstKey = null;
for(var key in myObject){
firstKey = key;
break;
}
这个工作得很好,它比第一个好,但我认为它很可怕(for
,break
以及所有这些只是为了得到第一个密钥。)
因此
我想知道是否有一种更优雅的方式来获得第一把钥匙?类似的东西:
var firstKey from myObject;
修改
我不关心我只想获得第一把钥匙的顺序。
EDIT2:
我有一个包含一些信息的对象(比方说,例如,一个人的名字是一个键,他的电子邮件将是值)。假设我有一个占位符,其中会打印一些名称和电子邮件地址。如果我按删除,我删除该条目(delete myObject[name];
),然后我需要用另一个名称和电子邮件填写该占位符(我不关心谁会做谁),所以第一个(或者第一个是现在)会做的。
答案 0 :(得分:4)
引自MDN's documentation on for...in
(我强调):
for...in
语句以 任意 顺序迭代对象的可枚举属性。
而documentation on Object.keys
有:
Object.keys()
方法返回给定对象自己的可枚举属性的数组,其中 相同顺序 由{{{ 1}}循环(不同之处在于for-in循环也枚举了原型链中的属性)。
因此第一个键的概念是模糊的。关于JavaScript对象中的属性顺序已经说了很多。您可能需要浏览Does JavaScript Guarantee Object Property Order?
您可以考虑使用Map
而不是具有(显然)动态属性的普通对象。 for...in
还存储键/值对,但保证保持插入顺序。
以下是一个示例,说明如何设置一些键/值对,然后获取第一个键值/值对。然后它删除第一个,下一个成为第一个:
Map

虽然对keys()
的调用可能会给人的印象是它会首先生成所有键的列表,但事实并非如此:它返回一个迭代器,而不是一个数组,只返回{{1}的调用实际上会取一个。
答案 1 :(得分:2)
唯一不会收集数组中所有属性的方法是for...in
。
您总是可以将其移动到一个函数以便更好地抽象:
function firstKey(obj) {
for (var key in obj)
if (Object.getOwnPropertyDescriptor(obj, key))
return key;
}
firstKey({a: 1}); // "a"
firstKey({}); // undefined
但是,请注意,它不会被很好地定义,因为for...in
和Object.keys
使用依赖于实现的顺序。
如果[[OwnPropertyKeys]]返回一个迭代器并且有一些方法可以公开它会更好:
Object.getOwnPropertyNamesIterator(obj).next().value; // this does not exist :(