如何访问Javascript中的对象的第一个属性?

有没有一种优雅的方式来访问对象的第一个属性…

  1. 你不知道你的财产的名字
  2. 没有使用像for .. in或jQuery的$.each

例如,我需要访问foo1对象而不知道foo1的名称:

 var example = { foo1: { /* stuff1 */}, foo2: { /* stuff2 */}, foo3: { /* stuff3 */} }; 
 var obj = { first: 'someVal' }; obj[Object.keys(obj)[0]]; //returns 'someVal' 

使用这个你可以通过索引访问其他属性。 请注意! 因为属性是根据javascript实现在对象内部sorting的。 但是,如果你确定对象只有一个属性,那么它的路要走(不是最快的寿)。

尝试for … in循环并在第一次迭代之后中断:

 for (var prop in object) { // object[prop] break; } 

使用Object.keys获取对象的属性数组。 例:

 var example = { foo1: { /* stuff1 */}, foo2: { /* stuff2 */}, foo3: { /* stuff3 */} }; var keys = Object.keys(example); // => ["foo1", "foo2", "foo3"] (Note: the order here is not reliable) 

文档和跨浏览器填充提供在这里 。 其中一个例子可以在我的另一个答案中find 。

编辑 :为了清楚起见,我只是想回应什么是正确的在其他答案:在JavaScript对象的关键顺序是未定义的。

没有“第一”财产。 对象键是无序的。

如果你用(var foo in bar)循环它们,你会按照某种顺序得到它们,但是将来可能会改变(尤其是如果你添加或删除其他键的话)。

一个规则版本:

 var val = example[function() { for (var k in example) return k }()]; 

不可以。由MDC定义的对象文字是:

包含在花括号({})中的一对零或更多对象的属性名称和关联值的列表。

因此,对象文本不是数组,只能使用显式名称访问属性,或者使用in关键字访问for循环。

你也可以做Object.values(example)[0]

这已经在这里覆盖了。

首先的概念不适用于对象属性,并且for … in循环的顺序不受规范的保证,但实际上它是可靠的FIFO, 除了 chrome( bug报告 )以外。 做出相应的决定。

我不build议你使用Object.keys,因为旧IE版本不支持它。 但是如果你真的需要这个,你可以使用上面的代码来保证后面的兼容性:

 if (!Object.keys) { Object.keys = (function () { var hasOwnProperty = Object.prototype.hasOwnProperty, hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'), dontEnums = [ 'toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor' ], dontEnumsLength = dontEnums.length; return function (obj) { if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object'); var result = []; for (var prop in obj) { if (hasOwnProperty.call(obj, prop)) result.push(prop); } if (hasDontEnumBug) { for (var i=0; i < dontEnumsLength; i++) { if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]); } } return result; }})()}; 

functionFirefox(Gecko)4(2.0)Chrome 5 Internet Explorer 9 Opera 12 Safari 5

更多信息: https : //developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys

但是如果你只需要第一个,我们可以安排一个更短的解决scheme,如:

 var data = {"key1":"123","key2":"456"}; var first = {}; for(key in data){ if(data.hasOwnProperty(key)){ first.key = key; first.content = data[key]; break; } } console.log(first); // {key:"key",content:"123"} 

如果你需要访问“对象的第一个属性”,这可能意味着你的逻辑有问题。 对象属性的顺序应该不重要。

使用数组而不是对象(方括号)。

 var example = [ {/* stuff1 */}, { /* stuff2 */}, { /* stuff3 */}]; var fist = example[0]; 

请注意,您丢失了'foo'标识符。 但是你可以添加一个名称属性到包含的对象:

 var example = [ {name: 'foo1', /* stuff1 */}, {name: 'foo2', /* stuff2 */}, {name: 'foo3', /* stuff3 */} ]; var whatWasFirst = example[0].name; 

解决scheme与lodash库:

 _.find(example) // => {name: "foo1"} 

但是不能保证对象属性的内部存储顺序,因为它依赖于JavaScript VM的实现。