在IE8中为对象中的每个属性添加附加属性的最佳方法是什么

时间:2013-10-08 12:45:23

标签: javascript jquery internet-explorer-8

首先,我想说我知道有很简单的方法解决这个问题,但只是通过谷歌搜索并查看stackoverflow它似乎没有一套方式你想要这样做,所以我想看到如果有人在那之前遇到过这个问题,并提出了一个很好的解决方案。这是我的问题,我想为对象中的每个属性添加一个额外的属性。这适用于较新的IE和Firefox,但会在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粉丝,$ .each有同样的问题。另外,我希望我不能支持IE8。

更新

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

附加信息:我实际上没有在真正的IE浏览器中测试过这个,我一直在使用IE10的开发者工具,为浏览器模式选择IE8,为文档模式选择IE 8标准。这可能会有所不同,我不确定。

2 个答案:

答案 0 :(得分: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 :(得分: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:

ie8

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

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