如何访问Javascript中的对象的第一个属性?
有没有一种优雅的方式来访问对象的第一个属性…
- 你不知道你的财产的名字
- 没有使用像
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的实现。