获取对象的第一个索引


201

考虑:

var object = {
  foo: {},
  bar: {},
  baz: {}
}

我该怎么做:

var first = object[0];
console.log(first);

显然,这不起作用,因为第一个索引名为foo,而不是0

console.log(object['foo']);

可以,但是我不知道它的名字叫foo。它可以命名为任何东西。我只想要第一个。

Answers:


61

如果对象的顺序很重要,则应修改JSON模式以将对象存储在数组中:

[
    {"name":"foo", ...},
    {"name":"bar", ...},
    {"name":"baz", ...}
]

或许:

[
    ["foo", {}],
    ["bar", {}],
    ["baz", {}]
]

正如Ben Alpert所指出的那样,Javascript对象的属性是无序的,并且如果您希望它们按与对象常量中指定的顺序相同的顺序枚举,则代码将被破坏—没有“ first”属性。


6
我从未见过for(i在obj中)以不同的顺序执行操作,您是不是说for(i在obj中)会以不同的顺序执行操作?
瑞安·佛罗伦萨

4
有可能会。规范说,不必按特定顺序枚举。这几乎意味着该顺序可能会更改。
PatrikAkerstrand,2009年

5
如今,大多数浏览器的确保留插入顺序,但并非总是如此。规格不是必需的,并且有一些新版本的Chrome浏览器未保留插入顺序。
英里

1
随着我对所做工作的深入了解,事情的顺序变得越来越重要(我以为我只关心第一个,但是我错了!),因此很显然,按照您的建议将对象存储在数组中。
瑞安·佛罗伦萨

1
如果您知道对象只有一个元素,那么您就知道顺序。
danorton

329

只是为了好玩,这在JS 1.8.5中有效

var obj = {a: 1, b: 2, c: 3};
Object.keys(obj)[0]; // "a"

这与您看到的顺序相同

for (o in obj) { ... }

24
除非需要石器时代的Backword兼容性,否则显然最好的选择。
Dag Sondre Hansen 2014年

1
100%最佳答案。这是最简单,最快的方法。
案例

3
只是为了说明一下,根据en.wikipedia.org/wiki/JavaScript#Version_history IE9之前不支持JS 1.8.5。不幸的是,许多人仍处于石器时代。
Noremac

太好了 简短而简单。感谢@Jacob
Sariban D'Cl

如果有人使用IE9,我会感到很痛。谢谢,这太棒了
CMS

204

如果您想要一些简洁的方法,请尝试:

for (first in obj) break;

alert(first);

包装为功能:

function first(obj) {
    for (var a in obj) return a;
}

8
请参阅下面的Luke Schafer的答案,它使用hasOwnProperty方法来确保您不获取原型成员。
代码指挥官

3
为了使一个衬板在包括IE8和更低版本的所有浏览器中都可以使用,for (var key in obj) if (obj.hasOwnProperty(key)) break;您将需要使用key变量
Ally

如果第一个元素是对象类型,则不起作用。返回0

Object.keys(obj)[0];(0.072ms)比for(1.644ms)快得多。
塞巴斯蒂安·奥尔特曼

77

他们并没有真正订购,但是您可以执行以下操作:

var first;
for (var i in obj) {
    if (obj.hasOwnProperty(i) && typeof(i) !== 'function') {
        first = obj[i];
        break;
    }
}

.hasOwnProperty()忽略原型的对象是很重要的。


上面的代码中有错误。typeof检查应为typeof(i)
jacob.toye 2012年

@Napalm他指的是正在检查的变量名中的错误,而不是语法。没错,但很多人都喜欢为提高可读性而置入括号
Luke Schafer 2012年

谢谢。太奇妙了。
Santosh

76

因为javascript对象是无序的,所以这不会给您第一个,但是在某些情况下还可以。

myObject[Object.keys(myObject)[0]]

39

您可以使用对象的第一把钥匙

console.log(Object.keys(object)[0]);//print key's name

为了价值

console.log(object[Object.keys(object)[0]]);//print key's value

18

无法获得第一个元素,因为JavaScript中的“哈希”(对象)具有无序属性。最好的选择是将密钥存储在数组中:

var keys = ["foo", "bar", "baz"];

然后使用它来获取正确的值:

object[keys[0]]


12

使用下划线,您可以使用_.pairs来获取第一个对象条目作为键值对,如下所示:

_.pairs(obj)[0]

然后,该键将带有下一个[0]下标,该值带有[1]


使用underscore.js时效果最佳。正是我所需要的...谢谢乔治!
Goldengalaxy

10

我昨天有同样的问题。我这样解决了:

var obj = {
        foo:{},
        bar:{},
        baz:{}
    },
   first = null,
   key = null;
for (var key in obj) {
    first = obj[key];
    if(typeof(first) !== 'function') {
        break;
    }
}
// first is the first enumerated property, and key it's corresponding key.

这不是最优雅的解决方案,而且我很确定在不同的浏览器中它可能会产生不同的结果(即,规范说不需要枚举来枚举与定义的顺序相同的属性)。但是,我的对象中只有一个属性,因此这不是问题。我只需要第一把钥匙。


1
嗨@PatrikAkerstrand早些时候,我无意中点击了downvote。请对您的答案进行任何更改,以撤消。抱歉。
rogeriolino

7

您可以执行以下操作:

var object = {
    foo:{a:'first'},
    bar:{},
    baz:{}
}


function getAttributeByIndex(obj, index){
  var i = 0;
  for (var attr in obj){
    if (index === i){
      return obj[attr];
    }
    i++;
  }
  return null;
}


var first = getAttributeByIndex(object, 0); // returns the value of the
                                            // first (0 index) attribute
                                            // of the object ( {a:'first'} )

6

获取对象的第一把钥匙

const myObject = {
   'foo1': { name: 'myNam1' },
   'foo2': { name: 'myNam2' }
}

const result = Object.keys(myObject)[0];

// result will return 'foo1'

这个答案与雅各的答案有什么区别?
YakovL

它使新手确信这种代码可以完美地工作。
Santosh

5

基于CMS 答案。我不直接获取值,而是在键的索引处获取键并使用它来获取值:

Object.keyAt = function(obj, index) {
    var i = 0;
    for (var key in obj) {
        if ((index || 0) === i++) return key;
    }
};


var obj = {
    foo: '1st',
    bar: '2nd',
    baz: '3rd'
};

var key = Object.keyAt(obj, 1);
var val = obj[key];

console.log(key); // => 'bar'
console.log(val); // => '2nd'

2

我的解决方案:

Object.prototype.__index = function(index)
{
    var i = -1;
    for (var key in this)
    {
        if (this.hasOwnProperty(key) && typeof(this[key])!=='function')
            ++i;
        if (i >= index)
            return this[key];
    }
    return null;
}
aObj = {'jack':3, 'peter':4, '5':'col', 'kk':function(){alert('hell');}, 'till':'ding'};
alert(aObj.__index(4));

12
不错,只有……您的编码风格!搞什么鬼?那些牙套无处不在!
飞羊

2
你知道python风格吗?我只是在python样式中添加了垂直对齐的括号。无论如何,“地狱是其他人”,:
D
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.