如何获取对象的第一个键?

时间:2017-01-27 20:37:30

标签: javascript object

我有一个对象,我想访问该对象的第一个元素,所以首先,我需要获取该对象的第一个键。我有两种方法可以做到,但我正在寻找更好的方法。

第一个是:

var firstKey = Object.keys(myObject)[0];

Object.keys将返回所有键的数组。所以如果我只想要第一个键,这个方法对于我的任务来说太贵了(特别是如果myObject有太多的键)。

第二种方法是:

var firstKey = null;
for(var key in myObject){
    firstKey = key;
    break;
}

这个工作得很好,它比第一个好,但我认为它很可怕(forbreak以及所有这些只是为了得到第一个密钥。)

因此

我想知道是否有一种更优雅的方式来获得第一把钥匙?类似的东西:

var firstKey from myObject;

修改

我不关心我只想获得第一把钥匙的顺序。

EDIT2:

我有一个包含一些信息的对象(比方说,例如,一个人的名字是一个键,他的电子邮件将是值)。假设我有一个占位符,其中会打印一些名称和电子邮件地址。如果我按删除,我删除该条目(delete myObject[name];),然后我需要用另一个名称和电子邮件填写该占位符(我不关心谁会做谁),所以第一个(或者第一个是现在)会做的。

2 个答案:

答案 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...inObject.keys使用依赖于实现的顺序。

如果[[OwnPropertyKeys]]返回一个迭代器并且有一些方法可以公开它会更好:

Object.getOwnPropertyNamesIterator(obj).next().value; // this does not exist :(