3

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

4

2 回答 2

2

显然,IE8 在使用for...in. 因此,您不断添加键...为您的其他属性添加其他属性等等。

无论如何,一个保障措施是首先像这样(小提琴)得到你的钥匙:

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);

于 2013-10-08T13:32:32.707 回答
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';
}

Edit:

Your code should work as it is:

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

Edit 2:

An implementation of Object.Keys for ie8

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

于 2013-10-08T12:48:02.517 回答