Prototype을 사용하여 자바 스크립트에서 객체의 모든 속성을 반복합니까?


89

Prototype JavaScript 프레임 워크를 사용하여 객체의 모든 속성을 반복하는 방법이 있습니까?

상황은 다음과 같습니다. JSON에서 다음과 같은 AJAX 응답을 받고 있습니다.

{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

변수에 대한 json 응답을 평가 response하면 response.barobj객체의 각 속성을 반복하여 어떤 인덱스가 참인지 거짓인지 확인할 수 있기를 원합니다 .

프로토 타입은 모두가 Object.keys()하고 Object.values()있지만 이상하게도 간단하지 보인다 Object.each()기능을! Object.keys () 및 Object.values ​​()의 결과를 가져 와서 하나를 반복하면서 다른 하나를 상호 참조 할 수 있지만, 적절한 방법이 있다고 확신하는 해킹입니다!

답변:


42

먼저 개체 리터럴을 프로토 타입 해시로 변환해야합니다 .

// Store your object literal
var obj = {foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

// Iterate like so.  The $H() construct creates a prototype-extended Hash.
$H(obj).each(function(pair){
  alert(pair.key);
  alert(pair.value);
});

완전한! 이것이 바로 제가 찾던 것입니다.
OverloadUT

57
안타깝게도 Prototype없이 간단한 자바 스크립트 객체를 반복하고자하는 유사한 질문이 종료되었으므로 이제이 답변을 "중복"으로 인해 종료 된 질문과 동일한 것으로 처리해야합니다. 따라서 사용자가 프로토 타입을로드하도록 강요하는 끔찍한 예입니다. 사용자가 Prototype에 대해 아무 말도하지 않았으므로 원하지 않는 라이브러리를로드하도록하는 것은 유용하지 않습니다. (이것을 정말로 중복 된 것처럼 취급하는 것을 기억하십시오). 다른 질문이 중복 주장으로 인해 종료되지 않았다면 나는 그 답에 대해 반대 투표를 할 필요가 없었을 것입니다.

2
질문자가 프로토 타입을 원한다고 언급하지 않았습니까 (또는 질문이 편집 되었습니까?)? 어쨌든 그것은 모든 좋은입니다
emurano

외부 라이브러리를로드 할 필요가 없습니다
Healkiss

553

여기서 프로토 타입이 필요하지 않습니다. JavaScript에는 for..in루프 가 있습니다. 당신이 확실하지 엉망 아무도 그 경우 Object.prototype, 확인하지 hasOwnProperty()뿐만 아니라, 즉,

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}

140
원하지 않는 라이브러리를로드하지 않고 실제 답변에 감사드립니다.

8
이것은 엄격한 대답이 아닙니다. 질문은 프로토 타입을 사용해야한다는 것입니다! 선택의 자유 - 하하 ...
스벤 라슨

1
이 질문의 원래 제목은 명확성을 위해 다시 추가 한 프로토 타입을 언급했습니다. 이 질문은 신체의 첫 번째 라인에서 입증 된 것처럼 Prototype이 사용중인 환경에 대해 구체적으로 묻는 질문이었습니다.
OverloadUT

1
더 당신이 자바 스크립트, 더 당신이 밖으로 쓰기 싫어 것이다 쓰기 for루프를 :)
삼부작

13
안타깝게도 이것은 "모든 객체 속성 자바 스크립트를 반복하는 방법"과 같은 것을 Google에서 검색하면 1 위로 떠오르는 질문이므로 여기에 오는 많은 사람들이이 질문에 대한 답을 찾고있을 것입니다. 그들이 원하는 질문은 이것입니다 : stackoverflow.com/questions/921789/… , 이것은 실제로 객체 리터럴과 관련이 없습니다.
Baxissimo

0

키를 반복하고 대괄호를 사용하여 값을 가져와야합니다.

참조 : 자바 스크립트 개체의 속성을 어떻게 열거합니까?

편집 : 분명히 이것은 질문을 복제합니다.


이 방법은 Prototype 문서에서 강력히 권장하지 않습니다 : prototypejs.org/api/array
OverloadUT

1
또한 내가 얻은 프로토 타입 네이티브 솔루션을 찾고 있었기 때문에 이것이 중복이라고 생각하지 않습니다. 다른 질문은 프레임 워크 사용을 원하지 않는 사람에게는 괜찮지 만 Prototype을 사용하는 경우이 솔루션이 훨씬 안전합니다.
OverloadUT

1
@OverloadUT : 충분히주의 깊게 읽지 않았습니다. 일반 객체가 아닌 배열의 속성을 반복하는 것은 권장되지 않습니다
Christoph
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.