永发信息网

js json动态改变属性时发现很奇怪的问题

答案:4  悬赏:0  手机版
解决时间 2021-04-04 09:59
js json动态改变属性时发现很奇怪的问题
最佳答案
var array=[];
var resp={"a":[{"c":"cc"},{"c":"ccc"}],"b":[{"d":"dd"},{"d":"ddd"}]};
for(var i=0; i{
for(var j=0; j{
    var json=resp.a[i];
    json.d=resp.b[j].d;//从这里开始就错了。你json.d把resp.a[i].d也赋值了。
    你对json的赋值不应该去影响到原有的数据resp。程序本身就是错误的。
    array.push(json);
    alert(JSON.stringify(array));
}
}正确的处理方式:

function shallowClone(obj){
    var clone = {};
    for(var p in obj){
        if(obj.hasOwnProperty(p)){
            clone[p] = obj[p];
        }
    }
    return clone;
}
var array=[];
var resp={"a":[{"c":"cc"},{"c":"ccc"}],"b":[{"d":"dd"},{"d":"ddd"}]};
for(var i=0; i{
for(var j=0; j{
    var json=shallowClone(resp.a[i]);
    json.d=resp.b[j].d;
    array.push(json);
    alert(JSON.stringify(array));
}
}追问谢谢!
全部回答
for (var i in resp) {
  for (var j in resp[i]) {
       console.log(resp[i][j]);
  }
}追问您这样只是打出了resp里的值追答push() 方法可把它的参数顺序添加到 arrayObject 的尾部。它直接修改 arrayObject,而不是创建一个新的数组。
所以。是 push影响了。 push吧你添加的json作为单个元素添加到数组中了。所以就修改了array

你要的是不是这个:

因为js中对象引用传值,所以一直指向resp.a[i],
追问也谢谢您!
修改
array.push(json);

array.push(JSON.parse(JSON.stringify(json)));
为毛会出现这种结果?
答:首先关键字是对象引用传递,
当i为0的时候,然后第二层循环j会执行2次,
var json=resp.a[0];
json.d=resp.b[0].d;
var json=resp.a[0];
json.d=resp.b[1].d;
其实第一次和第二次获得的json对象指向的是同一个东西,如果你用变量把两个json都保存下来的话,用 == 判断返回为true.
所以出现的现象是,array对象里 第0个 == 第1个, 第2个 == 第3个追问您的回答也能解决我的问题,思路很好,赞一个!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
wow任务科尔戈的黄金箱子在哪
崇州哪里有培训跳舞的
模仿《詹天佑》写一篇作文(500字)
单选题商品的两个基本属性是A.价值和交换价值
在上海高速紧急停车带停车交警来了直接扣6分
在九秀山庄的冰窖中怎样使用火把走出去啊?
(8分之1十5分之一)45
亚洲大部分国家从经济发展水平看属于________
交友联谊活动标语,相亲活动口号
狗狗抽搐感觉肚子里面始终有一股气出不来肚子
沙特阿拉伯是我国重要的石油供应国,从沙特运
什么是赶毛驴
什么是银行本票存款,银行本票提示见票是什么
______achievement,lastweek'sministeria
操作简便的叉车有哪些?
推荐资讯
唐玄奘是几年生的几年死的
已知对角线规则为:沿周期表中金属与非金属分
单选题Hewenttoseeher________otherdaydu
九选六是什么意思
网吧系统有哪些特点与普通电脑有哪些区别
男1988/8/18早晨1:30左右丑时生,时
天气热关心女友的句子,描写天气热的句子
建行本行同城转帐需要多长时间到账
唐山离潍坊多远,唐山到潍坊有多少公里
小故事30个字题目秋天的快乐不是作文?
描述伊朗的地形特征
地砖黑缝怎么处理瓷砖时间久了缝隙变黑怎么办
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?