获取对象的第一个索引

Rya*_*nce 196 javascript javascript-objects

考虑:

var object = {
  foo: {},
  bar: {},
  baz: {}
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做:

var first = object[0];
console.log(first);
Run Code Online (Sandbox Code Playgroud)

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

console.log(object['foo']);
Run Code Online (Sandbox Code Playgroud)

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

Jac*_*cob 325

只是为了好玩,这适用于JS 1.8.5

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

这符合您所看到的相同顺序

for (o in obj) { ... }
Run Code Online (Sandbox Code Playgroud)

  • 除非需要石器时代后缀兼容性,否则选择最佳选项. (24认同)
  • 只是为了澄清,根据http://en.wikipedia.org/wiki/JavaScript#Version_history,在IE9之前不支持JS 1.8.5.不幸的是,许多人仍处于石器时代. (3认同)

小智 204

如果你想要简洁的尝试:

for (first in obj) break;

alert(first);
Run Code Online (Sandbox Code Playgroud)

包装为功能:

function first(obj) {
    for (var a in obj) return a;
}
Run Code Online (Sandbox Code Playgroud)

  • 请参阅下面的Luke Schafer的回答,它使用hasOwnProperty方法来确保您不会抓取原型成员. (8认同)
  • 对于在所有浏览器(包括IE8及以下版本)中工作的单行程,使用`for(obj中的var键)if(obj.hasOwnProperty(key))break;`然后你将要使用`key`变量 (3认同)

Luk*_*fer 77

他们没有真正订购,但你可以这样做:

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

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

  • typeof是一个运营商 (4认同)

Rob*_*Fox 76

这不会给你第一个,因为javascript对象是无序的,但在某些情况下这很好.

myObject[Object.keys(myObject)[0]]
Run Code Online (Sandbox Code Playgroud)


Mil*_*les 61

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

[
    {"name":"foo", ...},
    {"name":"bar", ...},
    {"name":"baz", ...}
]
Run Code Online (Sandbox Code Playgroud)

或者可能:

[
    ["foo", {}],
    ["bar", {}],
    ["baz", {}]
]
Run Code Online (Sandbox Code Playgroud)

正如Ben Alpert指出的那样,Javascript对象的属性是无序的,如果您希望它们按照与对象文字中指定的顺序相同的顺序进行枚举,那么您的代码就会被破坏 - 没有"first"属性.

  • 我从来没有见过(我在obj)以不同的顺序做事,你是说有时候(我在obj中)会以不同的顺序踢出事物吗? (6认同)
  • 如今大多数浏览器确实保留了插入顺序,但情况并非总是如此; 它不是规范所要求的,并且最近版本的Chrome没有保留插入顺序. (5认同)
  • 它有可能会.规范说它不必按特定顺序列举.这几乎意味着该订单可能会发生变化. (4认同)

jit*_*ney 39

对于您可以使用的对象的第一个键

console.log(Object.keys(object)[0]);//print key's name
Run Code Online (Sandbox Code Playgroud)

为了价值

console.log(object[Object.keys(object)[0]]);//print key's value
Run Code Online (Sandbox Code Playgroud)


Sop*_*ert 17

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

var keys = ["foo", "bar", "baz"];
Run Code Online (Sandbox Code Playgroud)

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

object[keys[0]]
Run Code Online (Sandbox Code Playgroud)


Ric*_*tte 14

ES6

const [first] = Object.keys(obj)
Run Code Online (Sandbox Code Playgroud)


Geo*_*pty 12

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

_.pairs(obj)[0]
Run Code Online (Sandbox Code Playgroud)

然后键可以使用另一个[0]下标,值为[1]


Pat*_*and 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.
Run Code Online (Sandbox Code Playgroud)

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


CMS*_*CMS 6

你可以这样做:

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'} )
Run Code Online (Sandbox Code Playgroud)


小智 6

获取对象的第一个键

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

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

// result will return 'foo1'
Run Code Online (Sandbox Code Playgroud)


yck*_*art 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'
Run Code Online (Sandbox Code Playgroud)