为了账号安全,请及时绑定邮箱和手机立即绑定

如何给js的对象动态增加key?

如何给js的对象动态增加key?

呼唤远方 2019-04-16 20:27:01
我有这样一段代码_.each(course,function(value,key){course[key+"test"]=value+1;});这段代码在chrome下,是ok的。但是ie8下会报内存溢出。如果去掉test,就好了。_.each(course,function(value,key){course[key]=value+1;});求大神指点一下。谢谢了。
查看完整描述

2 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

不知道LZ的_.each是什么,很有可能是因为foreach循环会动态查询course的所有键值,由于键值不断增多,造成了死循环,造成内存溢出。
比如course是{a:1},死循环过程就是这样:
course["atest"]=2;
course["atesttest"]=3;
course["atesttesttest"]=4;
course["atesttesttesttest"]=5;
//...
ECMAScript的标准里面未定义for-in遍历顺序,新增键是否被遍历完全依赖于UA,无法强制保证新增的键会/不会被遍历到。
Themechanicsandorderofenumeratingtheproperties(step6.ainthefirstalgorithm,step7.ainthesecond)isnotspecified.Propertiesoftheobjectbeingenumeratedmaybedeletedduringenumeration.Ifapropertythathasnotyetbeenvisitedduringenumerationisdeleted,thenitwillnotbevisited.Ifnewpropertiesareaddedtotheobjectbeingenumeratedduringenumeration,thenewlyaddedpropertiesarenotguaranteedtobevisitedintheactiveenumeration.Apropertynamemustnotbevisitedmorethanonceinanyenumeration.
underscore避免这个死循环的方法是首先用一个数组缓存当前的keys(ECMAScript5里面有Object.keys,fallback方法则是forin循环),然后循环keys数组,这样在遍历过程中增加的key不会被遍历到。
functiongetKeys(obj){
if(Object.keys){
returnObject.keys(obj);
}
varkeys=[];
for(varkeyinobj){
if(obj.hasOwnProperty(key)){
keys.push(key);
}
}
returnkeys;
}
varcourse={a:1},
courseKeys=getKeys(course);
for(vari=0;icourse[courseKeys[i]+"test"]=i;
}
                            
查看完整回答
反对 回复 2019-04-16
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

function(key,value){
letkeyValue={};
keyValue[key]=value;
returnkey;
}
对象的伟大
                            
查看完整回答
反对 回复 2019-04-16
  • 2 回答
  • 0 关注
  • 5980 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号