是否有一种优雅的方式来访问对象的第一个属性......
for .. in
或jQuery的$.each
例如,我需要在不知道foo1:
的名称的情况下访问foo1
对象
var example = {
foo1: { /* stuff1 */},
foo2: { /* stuff2 */},
foo3: { /* stuff3 */}
};
答案 0 :(得分:1208)
var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'
使用此功能,您还可以通过索引访问其他属性。请注意!根据ECMAScript无法保证Object.keys
返回订单,但是非正式地通过所有主要浏览器实施,请阅读https://stackoverflow.com/a/23202095了解详细信息。
答案 1 :(得分:101)
尝试for … in
loop并在第一次迭代后中断:
for (var prop in object) {
// object[prop]
break;
}
答案 2 :(得分:44)
使用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)
提供了here的文档和跨浏览器垫片。可以在我的另一个答案here中找到它的使用示例。
编辑:为清楚起见,我只想回应其他答案中正确陈述的内容:javascript对象中的键顺序未定义。
答案 3 :(得分:34)
您也可以Object.values(example)[0]
。
答案 4 :(得分:21)
没有“第一”财产。对象键是无序的。
如果您使用(var foo in bar)
进行循环播放,则会以某种顺序对其进行循环播放,但将来可能会更改(尤其是添加或删除其他密钥时)。
答案 5 :(得分:21)
单规则版本:
var val = example[function() { for (var k in example) return k }()];
答案 6 :(得分:9)
答案 7 :(得分:9)
答案 8 :(得分:3)
我不建议您使用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;
}})()};
功能Firefox(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
但如果您只需要第一个,我们可以安排一个更短的解决方案,如:
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"}
答案 9 :(得分:2)
此处已经介绍过。
第一个概念不适用于对象属性,并且for ... in循环的顺序不受规范保证,但在实践中,它是可靠的FIFO ,除了对于chrome来说是关键的(bug report)。相应地做出决定。
答案 10 :(得分:2)
以下是获取第一把钥匙的一种更干净的方法:
var object = {
foo1: 'value of the first property "foo1"',
foo2: { /* stuff2 */},
foo3: { /* stuff3 */}
};
let [firstKey] = Object.keys(object)
console.log(firstKey)
console.log(object[firstKey])
答案 11 :(得分:1)
var obj = { first: 'someVal' };
let firstPropValue = Object.values(obj)[0];
这将始终返回第一个属性的值,在这种情况下为'someVal'
答案 12 :(得分:1)
如果有人更喜欢数组解构
const [firstKey] = Object.keys(object);
答案 13 :(得分:1)
您可以使用 Object.values() 来访问对象的值:
var obj = { first: 'someVal' };
Object.values(obj)[0]; // someVal
答案 14 :(得分:0)
使用数组而不是对象(方括号)。
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;
答案 15 :(得分:0)
如果您需要访问“对象的第一个属性”,则可能意味着您的逻辑存在问题。对象属性的顺序无关紧要。
答案 16 :(得分:0)
有什么理由不这样做?
> example.map(x => x.name);
(3) ["foo1", "foo2", "foo3"]
答案 17 :(得分:0)
要获取对象中的第一个键名称,可以使用:
var obj = { first: 'someVal' };
Object.keys(obj)[0]; //returns 'first'
返回一个字符串,因此您无法访问嵌套对象,例如:
var obj = { first: { someVal : { id : 1} };
在此解决方案中,您无法访问ID。
如果要获取实际对象,最好的解决方案是使用lodash之类的方法:
obj[_.first(_.keys(obj))].id
要返回第一个键的值,(如果您不确切知道第一个键的名称):
var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'
如果知道密钥名称,请使用:
obj.first
或
obj['first']
答案 18 :(得分:0)
最上面的答案可以生成整个数组,然后从列表中捕获。这是另一个有效的快捷方式
var obj = { first: 'someVal' };
Object.entries(obj)[0][1] // someVal
答案 19 :(得分:0)
您可以使用Object.prototype.keys
以相同的顺序返回对象的所有键。因此,如果您想要第一个对象,只需获取该数组并将第一个元素用作所需键即可。
const o = {“ key1”:“ value1”,“ key2”:“ value2”};
const idx = 0; //添加要为其赋值的索引
var key = Object.keys(o)[idx];
值= o [键]
console.log(key,value); // key2 value2
答案 20 :(得分:0)
您可以使用可以按其插入顺序进行迭代并可以访问其第一项的Maps。
var map = new Map();
map.set('first', 'foo');
map.set('second', 'bar');
map.set('third', 'foo bar');
var iterator = map.entries();
console.log(iterator.next().value[1]);
答案 21 :(得分:0)
我们也可以使用此方法。
var example = {
foo1: { /* stuff1 */},
foo2: { /* stuff2 */},
foo3: { /* stuff3 */}
};
Object.entries(example)[0][1];