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

<html><head><scriptsrc="js/json2.js"type="text/javascript"></script></head><scripttyp... <html>
<head>
<script src="js/json2.js" type="text/javascript"></script>
</head>
<script type="text/javascript">
var array=[];
var resp={"a":[{"c":"cc"},{"c":"ccc"}],"b":[{"d":"dd"},{"d":"ddd"}]};
for(var i=0; i<resp.a.length; i++)
{
for(var j=0; j<resp.b.length; j++)
{
var json=resp.a[i];
json.d=resp.b[j].d;
array.push(json);
alert(JSON.stringify(array));
}
}
</script>
</html>

问题是:
alert按顺序输出应该为
[{"c":"cc","d":"dd"}]
[{"c":"cc","d":"dd"},{"c":"cc","d":"ddd"}]
[{"c":"cc","d":"dd"},{"c":"cc","d":"ddd"},{"c":"cc","d":"dd"}]
[{"c":"cc","d":"dd"},{"c":"cc","d":"ddd"},{"c":"cc","d":"dd"},{"c":"cc","d":"ddd"}]
可是,实际输出竟然为
[{"c":"cc","d":"dd"}]
[{"c":"cc","d":"ddd"},{"c":"cc","d":"ddd"}]
[{"c":"cc","d":"ddd"},{"c":"cc","d":"ddd"},{"c":"cc","d":"dd"}]
[{"c":"cc","d":"ddd"},{"c":"cc","d":"ddd"},{"c":"cc","d":"ddd"},{"c":"cc","d":"ddd"}]
求大神帮忙,谢了先
展开
 我来答
weixiao800
2014-11-07 · TA获得超过824个赞
知道小有建树答主
回答量:482
采纳率:0%
帮助的人:439万
展开全部
修改

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个
追问
您的回答也能解决我的问题,思路很好,赞一个!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
老夭来了
2014-11-07 · 知道合伙人软件行家
老夭来了
知道合伙人软件行家
采纳数:1806 获赞数:8100
2008年从事软件开发,拥有多年的python,php,linux工作经验,发布过多个python,php的开源项目。

向TA提问 私信TA
展开全部

你要的是不是这个:

<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
<script type="text/javascript">
    var array = [];

    var resp = {
        "a": [
            {"c": "cc"},
            {"c": "ccc"}
        ],
        "b": [
            {"d": "dd"},
            {"d": "ddd"}
        ]};

    for (var i = 0; i < resp.a.length; i++) {
        for (var j = 0; j < resp.b.length; j++) {
            var json = resp.a[i];
            json.d = resp.b[j].d;
            array.push($.extend(true, {}, json));
            alert(JSON.stringify(array));
        }
    }
</script>

因为js中对象引用传值,所以一直指向resp.a[i],

追问
也谢谢您!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cainiaokan
2014-11-07 · TA获得超过2917个赞
知道小有建树答主
回答量:651
采纳率:66%
帮助的人:612万
展开全部
var array=[];
var resp={"a":[{"c":"cc"},{"c":"ccc"}],"b":[{"d":"dd"},{"d":"ddd"}]};
for(var i=0; i<resp.a.length; i++)
{
for(var j=0; j<resp.b.length; 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<resp.a.length; i++)
{
for(var j=0; j<resp.b.length; j++)
{
    var json=shallowClone(resp.a[i]);
    json.d=resp.b[j].d;
    array.push(json);
    alert(JSON.stringify(array));
}
}
追问
谢谢!
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
幻想武士
2014-11-07 · TA获得超过1074个赞
知道小有建树答主
回答量:639
采纳率:90%
帮助的人:401万
展开全部
for (var i in resp) {
  for (var j in resp[i]) {
       console.log(resp[i][j]);
  }
}
追问
您这样只是打出了resp里的值
追答
push() 方法可把它的参数顺序添加到 arrayObject 的尾部。它直接修改 arrayObject,而不是创建一个新的数组。
所以。是 push影响了。 push吧你添加的json作为单个元素添加到数组中了。所以就修改了array
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式