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.