是否有一种优雅的方法来访问对象的第一个属性。。。
你不知道你的财产的名字而不使用像..这样的循环。。in或jQuery的$.each
例如,我需要在不知道foo1名称的情况下访问foo1对象:
var example = {
foo1: { /* stuff1 */},
foo2: { /* stuff2 */},
foo3: { /* stuff3 */}
};
是否有一种优雅的方法来访问对象的第一个属性。。。
你不知道你的财产的名字而不使用像..这样的循环。。in或jQuery的$.each
例如,我需要在不知道foo1名称的情况下访问foo1对象:
var example = {
foo1: { /* stuff1 */},
foo2: { /* stuff2 */},
foo3: { /* stuff3 */}
};
当前回答
否。MDN定义的对象文本是:
一个对象的零对或多对属性名和相关值的列表,用大括号({})括起来。
因此,对象文字不是数组,您只能使用其显式名称或使用in关键字的for循环访问财产。
其他回答
这是一个老问题,但大多数解决方案都假设我们知道属性的名称,但事实并非如此。例如,如果您试图从用户可以上传的文件或类似案例中可视化数据,则情况并非如此。
这是我使用的一个简单函数,在两种情况下都可以使用,即您知道变量,如果不知道,它将返回对象的第一个属性(按字母顺序排序)
label函数接收对象d,如果存在则提取键,否则返回对象的第一个属性。
常量数据=[{label:“A”,值:10},{标签:“B”,值:15},{label:“C”,值:20},{label:“D”,值:25},{label:“E”,值:30}]const keys=['label',0,'',null,undefined]常量标签=(d,k)=>k?d[k]:对象.值(d)[0]data.forEach(d=>{console.log(`first:${label(d)},label:${label(d,keys[0])}`)})keys.forEach(k=>{console.log(`${k}的标签:${label(data[0],k)}`)})
对于0、“”、null和undefined等值,将返回数组的第一个元素。
我不建议您使用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(壁虎)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"}
否。MDN定义的对象文本是:
一个对象的零对或多对属性名和相关值的列表,用大括号({})括起来。
因此,对象文字不是数组,您只能使用其显式名称或使用in关键字的for循环访问财产。
var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'
Object.values(obj)[0]; // returns 'someVal'
使用它,您还可以通过索引访问其他财产。请注意!Object.keys或Object.values的返回顺序并不能根据ECMAScript得到保证,但所有主要浏览器实现都是非官方的,请阅读https://stackoverflow.com/a/23202095有关详细信息。
如果您需要访问“对象的第一个属性”,这可能意味着您的逻辑有问题。对象财产的顺序无关紧要。