首先,我想说我知道有很简单的方法解决这个问题,但只是通过谷歌搜索并查看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标准。这可能会有所不同,我不确定。
答案 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