객체의 첫 번째 인덱스 얻기


201

치다:

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

어떻게해야합니까 :

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

첫 번째 색인의 이름이 아닌이므로 작동하지 foo않습니다 0.

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

작동하지만 foo라는 이름을 모르겠습니다. 그것은 무엇이든 지명 될 수 있습니다. 나는 단지 첫 번째를 원한다.

답변:


61

객체의 순서가 중요한 경우 객체를 배열에 저장하도록 JSON 스키마를 수정해야합니다.

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

또는 아마도 :

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

Ben Alpert가 지적했듯이 Javascript 객체의 속성은 정렬되지 않으며 객체 리터럴에 지정된 순서대로 열거 할 것으로 예상되면 코드가 손상됩니다. "첫 번째"속성은 없습니다.


6
나는 (i의 obj)가 다른 순서로 일하는 것을 본 적이 없다. 때때로 (i의 obj)가 다른 순서로 일을 시작한다고 말하는가?
Ryan Florence

4
가능할 수도 있습니다. 사양에 따르면 특정 순서로 열거 할 필요는 없습니다. 이것은 주문이 변경 될 수 있음을 의미합니다.
PatrikAkerstrand

5
요즘 대부분의 브라우저는 삽입 순서를 유지하지만 항상 그런 것은 아닙니다. 사양에 필요하지 않으며 게재 신청서를 유지하지 않은 최신 버전의 Chrome이 있습니다.
마일리지

1
내가하고있는 일에 대해 더 깊이 알게됨에 따라 일의 순서가 더 중요해졌습니다.
Ryan Florence

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
석기 시대 백 워드 호환성이 필요하지 않은 경우 최상의 옵션을 선택하십시오.
Dag Sondre Hansen

1
100 % 최고의 답변입니다. 이것이 가장 쉽고 빠른 방법입니다.
Case

3
en.wikipedia.org/wiki/JavaScript#Version_history 에 따르면 JS 1.8.5는 IE9 이전 버전에서는 지원되지 않습니다. 불행히도 많은 사람들이 여전히 석기 시대에 있습니다.
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

첫 번째 요소가 객체 유형 인 경우 작동하지 않습니다.
snow

Object.keys(obj)[0];(1.644ms)보다 훨씬 빠릅니다 ( for0.072ms).
Sebastian Ortmann

77

그들은 실제로 주문 되지 는 않지만 할 수 있습니다 :

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

.hasOwnProperty()프로토 타입 객체를 무시 하는 것이 중요합니다.


위의 코드에 오류가 있습니다. 점검 유형은 typeof (i)
jacob.toye

@ Napalm 그는 구문이 아닌 검사중인 변수 이름의 오류를 언급했습니다. 맞습니다. 그러나 많은 사람들이 가독성을위한 브라케팅을 좋아합니다
Luke Schafer

감사합니다. 놀랍다.
Santosh

76

이것은 자바 스크립트 객체가 정렬되지 않았으므로 첫 번째 것을 제공하지는 않지만 경우에 따라 괜찮습니다.

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]]

16

ES6

const [first] = Object.keys(obj)

작동하지만 작동 방식을 설명해 주시겠습니까? 코드를 표시하는 것만으로는 이해하지 못합니다.
Daan

1
그것은이다 destructuring 할당 . 기본적으로 반환 된 배열의 첫 번째 요소를 대괄호 안의 변수에 할당합니다.
Richard Ayotte

12

밑줄을 사용하면 _.pairs를 사용하여 다음과 같이 첫 번째 객체 항목을 키 값 쌍으로 가져올 수 있습니다.

_.pairs(obj)[0]

그런 다음 키를 추가 [0]첨자 로 사용할 수 있습니다.[1]


underscore.js를 사용할 때 가장 잘 작동합니다. 내가 필요한 것 ... 고마워, 조지!
골든 갤럭시

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를 클릭했습니다. 취소하려면 Anwser를 변경하십시오. 죄송합니다.
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
파이썬 스타일을 아십니까? 파이썬 스타일에 세로 정렬 괄호를 추가했습니다. 어쨌든, "지옥은 다른 사람들이다", :-D
diyism
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.