인덱스로 숫자가 아닌 객체 속성에 액세스 하시겠습니까?


88

다음과 같은 배열이있는 경우 :

var arr = ['one','two','three'];

이렇게하면 다른 부분에 액세스 할 수 있습니다.

console.log(arr[1]);

키가 아닌 순서로 객체 속성에 액세스하려면 어떻게해야합니까?

예:

var obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
},
jbo = {
    'evenmore'  : 'crazy',
    'something' : 'awesome'
};

속성 이름을 명시 적으로 사용하지 않고 각 개체의 첫 번째 속성 ( "something"from obj및 "evenmore"from-)을 어떻게 얻 jbo습니까?

자, 여러분 중 일부는 내가 다음과 같은 것을 추구한다고 생각하는 것 같습니다.

console.log(obj['something']);

이것은 사실이 아닙니다. 가능한 경우 첫 번째 예와 마찬가지로 인덱스를 대상으로 특별히 찾고 있습니다.


2
"개체 배열"은 무엇을 의미합니까? 배열 객체입니다. 배열이 아닌 객체를 의미합니까, 아니면 객체 배열을 의미합니까? 그리고 jQuery는 귀하의 질문에 어떻게 영향을 미칩니 까? 유일한 코드 예제는 수행 방법을 이미 알고있는 부분을 보여줍니다. 문제 를 설명하는 코드를 제공하는 것은 어떻습니까 ?
user113716

@ Ӫ _._ Ӫ jQuery에 태그를 붙인 이유는 더 많은 청중을 확보하기 위해서입니다. jQuery를 아는 사람은 내 질문과 모순되는 것이 아니라, 교과서에 대한 이해가 있어야한다고 생각했습니다.
daryl

4
사실 저는 jQuery를 "알고"자바 스크립트를 모르는 사람들이 그 반대의 경우보다 더 많다고 말하고 싶습니다 (적어도 자바 스크립트를 아는 사람들은 jQuery를 쉽게 이해할 수 있어야합니다) .... 그리고 실제 질문과 관련하여 : 아니요, 당신은 인덱스로 objec 속성에 액세스 할 수 없습니다. 주문되지 않았습니다.
Felix Kling

2
"... jQuery를 아는 사람은 어레이의 이해가 있어야한다고 생각했습니다 ..." 나는 그것에 내기하지 않을 것입니다.
user113716

1
@Brogrammer :이 질문은 jQuery와 관련이 없으므로 jQuery 태그가 부적절합니다.
outis

답변:


127

"가능한 경우 첫 번째 예와 마찬가지로 색인을 구체적으로 타겟팅하려고합니다."

아니요, 불가능합니다.

가장 가까운 방법은 객체 키의 배열을 가져 와서 다음을 사용하는 것입니다.

var keys = Object.keys( obj );

...하지만 정의한 순서대로 키가 반환된다는 보장은 없습니다. 따라서 다음과 같이 보일 수 있습니다.

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'

6
Object.keys()객체의 내용을 안다면 안정적으로 사용할 수 있습니다. 여기에 더 많은 세부 사항 : stackoverflow.com/questions/280713/...
cronoklee

3
Object.keys () 메서드는 for ... in 루프에서 제공하는 것과 동일한 순서로 지정된 객체의 고유 한 열거 가능한 속성 배열을 반환합니다 (for-in 루프가 프로토 타입 체인의 속성을 다음과 같이 열거한다는 점이 다릅니다. 잘). developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
아 므르 Ragaey

6
모든 것이 가능합니다
Cas Bloem

48

이 작업을 수행 할 수있는 유일한 방법은를 사용하여 속성을 제공하는 메서드를 만드는 것입니다 Object.keys();.

var obj = {
    dog: "woof",
    cat: "meow",
    key: function(n) {
        return this[Object.keys(this)[n]];
    }
};
obj.key(1); // "meow"

데모 : http://jsfiddle.net/UmkVn/

이것을 사용하는 모든 객체로 확장 할 수 Object.prototype;있지만 일반적으로 권장되지는 않습니다.

대신 함수 도우미를 사용하세요.

var object = {
  key: function(n) {
    return this[ Object.keys(this)[n] ];
  }
};

function key(obj, idx) {
  return object.key.call(obj, idx);
}

key({ a: 6 }, 0); // 6

1
이것은 멋지고 매력처럼 작동합니다! 왜 받아 들여지지 않는 대답입니까? return this[Object.keys(this)[n]];일반적으로 사용하려면 을 사용해야 합니다.
cronoklee

3
안녕하세요, 2016 년부터 우리 미래의 사람들은 여전히 ​​이것이 받아 들여진 대답이어야한다고 생각합니다. 훌륭한 솔루션
mhodges

대답이 허용되지 않는 이유는 es6까지 Object.keys의 순서가 보장되지 않기 때문입니다. 따라서 해당 코드가 몇 가지 JS 엔진에서 작동하더라도 모든 엔진에서 작동한다고 보장 할 수는 없습니다. stackoverflow.com/questions/5525795/…
ptoinson dec.

13

Object.values()을 사용하지 않으려면 방법을 사용할 수 있습니다 Object.keys().

Object.keys()주어진 객체의 고유 한 열거 가능한 속성의 배열을 반환하는 메서드와는 반대로 , 예를 들면 다음과 같습니다.

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.keys(object1));

다음 배열을 인쇄합니다.

[ 'a', 'b', 'c' ]

Object.values()메서드는 지정된 객체의 고유 한 열거 가능한 속성 배열을 반환합니다 values.

따라서 동일한 객체가 있지만 대신 값을 사용하는 경우

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.values(object1));

다음 배열을 얻을 수 있습니다.

[ 'somestring', 42, false ]

따라서 액세스하려면 object1.b 싶지만 대신 색인을 사용하려면 다음을 사용할 수 있습니다.

Object.values(object1)[1] === 42

이 방법에 대한 자세한 내용은 여기에서 읽을 수 있습니다 .


1
이 주제에서 제안하는이 방법은 가장 짧고 가장 우아한 것 같습니다.
Petro Franko

5
var obj = {
    'key1':'value',
    '2':'value',
    'key 1':'value'
}

console.log(obj.key1)
console.log(obj['key1'])
console.log(obj['2'])
console.log(obj['key 1'])

// will not work
console.log(obj.2)

편집하다:

"가능한 경우 첫 번째 예와 마찬가지로 색인을 구체적으로 타겟팅하려고합니다."

사실 '색인'이 핵심입니다. 키의 위치를 ​​저장하려면이를 처리 할 사용자 지정 개체를 만들어야합니다.


나는 당신이 열쇠로 그것을 접근 할 수 있다는 것을 압니다. 그것은 내가 요구 한 것이 아닙니다.
daryl

@Brogrammer : 귀하의 질문이 모호하므로이 게시물은 잠재적으로 작성된 질문에 답변합니다.
outis

2

jquery로 다음과 같이 할 수 있습니다.

var arr = $.map(obj,function(value, key) {
    return value;
});
alert(obj[0]);

2

키 배열을 가져 와서 뒤집은 다음 루프를 실행합니다.

  var keys = Object.keys( obj ).reverse();
  for(var i = 0; i < keys.length; i++){
    var key = keys[i];
    var value = obj[key];
    //do stuff backwards
  }

1

개체 필드로 채워진 배열을 만들고 배열의 인덱스를 사용하고이를 통해 개체 속성에 액세스 할 수 있습니다.

propertiesName:['pr1','pr2','pr3']

this.myObject[this.propertiesName[0]]

1

나는 계속해서 당신을 위해 기능을 만들었습니다.

 Object.prototype.getValueByIndex = function (index) {
     /*
         Object.getOwnPropertyNames() takes in a parameter of the object, 
         and returns an array of all the properties.
         In this case it would return: ["something","evenmore"].
         So, this[Object.getOwnPropertyNames(this)[index]]; is really just the same thing as:
         this[propertyName]
    */
    return this[Object.getOwnPropertyNames(this)[index]];
};

let obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
};

console.log(obj.getValueByIndex(0)); // Expected output: "awesome"


1
당신의 접근 방식에서 무슨 일이 일어나고 있는지 설명해 주시겠습니까?
Rahul Bhobe

코드에 주석을 추가 했으므로 수행중인 작업을 이해할 수 있습니다.
StackGeek

0

Object.keys ()가 올바른 순서로 키를 반환하는지 확실하지 않은 경우 대신이 논리를 시도해 볼 수 있습니다.

var keys = []
var obj = {
    'key1' : 'value1',
    'key2' : 'value2',
    'key3' : 'value3',
}
for (var key in obj){
    keys.push(key)
}
console.log(obj[keys[1]])
console.log(obj[keys[2]])
console.log(obj[keys[3]])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.