获取JavaScript对象的第一个键名

281

假设我们有以下的JavaScript对象:

ahash = {"one": [1,2,3], "two": [4,5,6]}

有没有一种函数可以返回给定对象的第一个键名?

从上面的示例中,我希望获得该函数的结果为one


你想要对象的第一个键的值还是第一个键的名称?我有点困惑。 - Diego Unanue
7
[first]等于ahash对象的第一个键名。 - Ntiyiso Rikhotso
那个问题不是另一个提到的问题的重复,重复的问题是关于“如何获取第一个属性值”,而这个问题是关于“如何获取第一个属性键名”。 - electroid
8个回答

629

在JavaScript中,你可以做以下事情:

Object.keys(ahash)[0];

11
可在浏览器上运行。 - Alon Amir
4
这是一段有问题的代码。我原本以为需要用一个愚蠢的for循环来遍历字典并使代码变得杂乱无章。 - Jake
21
我想指出的是,for (key in dict) 很可能比起 O(n) 能够显著地更快地执行,时间复杂度是 O(1)。这一点一点也不傻。 - Steven Lu
9
给未来的我... 注意,对象(Object)上也有一个"value"方法,即Object.value,如果你想获取第一个键(key)的值,可以使用它。 - engineerDave
14
@engineerDave,我是你的未来自己。我们改变了StackOverflow账户的名称,并通过发明时间旅行赚了一大笔钱,但这并不是重点。我只想说,“谢谢”,这个小提示帮了我很多。 - isaacdre
显示剩余4条评论

65

您可以根据数组位置查询对象的内容。
例如:

 let obj = {plainKey: 'plain value'};

 let firstKey = Object.keys(obj)[0]; // "plainKey"
 let firstValue = Object.values(obj)[0]; // "plain value"

 /* or */

 let [key, value] = Object.entries(obj)[0]; // ["plainKey", "plain value"]

 console.log(key); // "plainKey"
 console.log(value); // "plain value"

1
似乎没有回答问题。 - xiawi
1
使用显式构造的对象作为问题的示例将提供更好的答案。这个答案基本上是正确的,但需要对Javascript有太微妙的了解才能轻松地解释其含义。 - CXJ
1
感谢您的评论,已更改为更易懂的代码。 - Ilya Degtyarenko

40

在哈希表中(JavaScript 称为对象),不存在“第一个”键这样的概念,它们本质上是无序的。你是否指的只是选择任何一个键:

for (var k in ahash) {
    break
}

// k is a key in ahash.

7
请问需要翻译的原文是什么语言?如果原文为中文,可以直接提供原文进行翻译。 - vsync
如何获取其他的内容? - Santosh
我认为这不是推荐的解决方案。这使用了一个名为“变量提升”的不良特性。而且ES6已经建议不要在for循环中使用'var'。 - 刘宇翔
2
EMCA脚本规范使字典变得有序。它们是“有序字典”。 枚举的顺序与将字典项添加到字典中的顺序相同。这非常有用。例如,在Python中,OrderedDictionary是一个特定的类,其中Dictionary在枚举时返回键的不确定排序。 - Jay Day Zee
@JayDayZee ECMAScript 没有叫做“字典”的东西,对吧?这个回答(https://dev59.com/jW035IYBdhLWcg3wQtsg#5525820)似乎表明对象是无序的,而 Maps 是有序的。这是否符合您的理解? - Ned Batchelder
1
JavaScript中的“对象”是非常复杂的东西,它实现了:键值存储;单独的编号值存储(数组);原型。其中“键值存储”部分是一个“字典”。枚举键(例如Object.keys(someRandomObject)返回键,而不是任意顺序、随机顺序或其他特定顺序,而是按添加顺序排序。在Python中,你的答案是正确的,因为没有“第一个”键。(我猜想,在Python中返回的键的“顺序”与键哈希有关)。 - Jay Day Zee

20

尝试这个:

for (var firstKey in ahash) break;

alert(firstKey);  // 'one'

请注意,您必须使用 var 关键字;letconst 不足以满足要求。 - David Callanan
5
不,请不要这样做。这可能是正确的,但它是一个非常不专业和令人困惑的解决方案。 - Peter Chaula

18

如果您决定使用Underscore.js,最好这样做

_.values(ahash)[0]

获得价值,或者

_.keys(ahash)[0]

获取密钥。


7

我出于防御性编程的原因使用Lodash

特别是在我试图获取键的对象中,有时我不知道是否存在属性。

使用Lodash的“完全防御”方法将同时使用keysget

const firstKey = _.get(_.keys(ahash), 0);

7

使用Underscore.js,您可以执行以下操作:

_.find( {"one": [1,2,3], "two": [4,5,6]} )

它会返回 [1,2,3]。

1
同样适用于lodash :) - crackmigg
1
还有一个 findKey 方法,它返回键(而不是值)。 - XoXo

1
你可以同时将元素放入数组和哈希表中。
var value = [1,2,3];
ahash = {"one": value};
array.push(value);

数组可以按照它们的顺序获取值,哈希表可以按照它们的键获取值。但是在添加和删除元素时要小心。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接