2013-10-08 2 views
3

먼저이 문제를 해결할 수있는 방법이 있다는 것을 알고 싶습니다. 그러나 googleing과 stackoverflow를 보면 거기에있는 것처럼 보이지 않습니다. 당신이이 일을하는 것에 대해 생각해 볼 수있는 정해진 방법입니다. 그래서 저 밖의 누군가가이 문제에 뛰어 들어 좋은 해결책을 찾았는지 알고 싶었습니다. 여기에 내 문제가 있습니다, 개체의 각 속성에 대한 추가 속성을 추가하고 싶습니다. 새로운 IE와 Firefox에서는 잘 작동하지만 IE8에서는 무한 루프가 발생합니다.IE8의 개체에있는 각 속성에 대한 추가 속성을 추가하는 방법은 무엇입니까

var oObject = { One : '1', Two : '2' }; 

for (var key in oObject) // Loops twice in IE10 and FF, loops infinitely in IE8 
{ 
    console.log(oObject[key]); 
    oObject[key+'_additionalProperty'] = 'Test'; 
} 

단지 oObject의 각 속성에 대해 추가 속성을 추가 oObject의 원래 값을 유지하는 변수를 만들 필요없이이 작업을 수행 할 수있는 방법이 있나요?

참고 : jQuery 팬들에게 $. 모두 동일한 문제가 있습니다. 또한 IE8을 지원하지 않을 수도 있습니다.

UPDATE :

JSFIDDLE :http://jsfiddle.net/dwaddell/rH89K/

추가 정보 : 사실 진정한 IE 브라우저에서이 테스트를하지 않은, 나는 IE10에서 개발자 도구를 사용하기위한 IE8을 선택되었습니다 브라우저 모드 및 문서 모드에 대한 IE 8 표준 이것은 약간의 차이를 만들지 모르겠다.

+0

당신이 IE8에 나를 위해 좋은 작품을 제공하는 코드를, 어쩌면 뭔가가있다 그게 문제 야? –

+0

@Fibbe 1 분이 지나면 jsFiddle을 만들겠습니다. 문제가 있다고 생각했던 코드를 물결 모양으로 만들었습니다. 조금 더 나가서 어쩌면 뭔가 문제가 생길 수 있습니다. – dwaddell

+0

@ Fibbe IE10에서 IE8로 전환하면 "SCRIPT7 : Out of memory"오류가 발생할 때까지 여러 번 Test의 console.log가 표시됩니다. 나는 여기에 IE8 만있는 컴퓨터가 있다고 생각하는데, 똑같은 문제가 있는지 알아보기 위해 노력해야 할 것이다. – dwaddell

답변

2

분명히 IE8은 for...in을 사용할 때 속성 목록을 캐시하지 않습니다. 따라서 키를 계속 추가하고 추가 속성에 대한 추가 속성 등을 추가합니다. 여하튼

는 안전 장치가과 같이 첫 번째 ( fiddle를) 당신의 열쇠를 얻을 수 있습니다 :

var oObject = { 
 
    One: '1', 
 
    Two: '2' 
 
}; 
 

 
var keys = []; // plain array for caching our keys 
 

 
// add keys to our cache 
 
for (var key in oObject) { 
 
    keys.push(key); 
 
} 
 

 
// loop through the cached keys and add new properties to oObject 
 
for (var i = 0, ln = keys.length; i < ln; i++) { 
 
    oObject[keys[i] + "_additionalProperty"] = "test"; 
 
} 
 

 
console.log(oObject);

1
var oObject = { One : '1', Two : '2' }; 
var keys = Object.keys(oObject); 
for (var i=0;i<keys.length;i++) // Loops twice in IE10 and FF, loops infinitely in IE8 
{ 
    oObeject[keys[i]+'_additionalProperty'] = 'Test'; 
} 

편집 :

그대로 귀하의 코드가 작동해야합니다

http://msdn.microsoft.com/en-us/library/ie/gg622937(v=vs.85).aspx

편집 2 :

Object.keys = Object.keys || function(o) { 
    var result = []; 
    for(var name in o) { 
     if (o.hasOwnProperty(name)) 
      result.push(name); 
    } 
    return result; 
}; 
IE8

에 대한 Object.Keys의

구현

http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation

+0

고맙습니다 @Pheonix, 나는 그것을 사용하는 것 같았지만, 아아 Object.keys는 IE8에는 존재하지 않습니다. IE8에서이 작업을 수행하는 쉬운 방법이 없다는 사실을 알려주고 있습니다. – dwaddell

+0

@dwaddell이 편집을 추가했습니다. Btw를 사용하면 ie8의 루프 내부에서 document.write 또는 경고를 수행하고 반복되는 내용을 볼 수 있습니까? 죄송합니다 ie8에 액세스 할 수 없습니다. – Pheonix

관련 문제