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"}]
求大神帮忙,谢了先 展开
<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"}]
求大神帮忙,谢了先 展开
4个回答
展开全部
修改
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个
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 · 知道合伙人软件行家
老夭来了
知道合伙人软件行家
向TA提问 私信TA
知道合伙人软件行家
采纳数: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],
追问
也谢谢您!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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));
}
}
追问
谢谢!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
for (var i in resp) {
for (var j in resp[i]) {
console.log(resp[i][j]);
}
}
追问
您这样只是打出了resp里的值
追答
push() 方法可把它的参数顺序添加到 arrayObject 的尾部。它直接修改 arrayObject,而不是创建一个新的数组。
所以。是 push影响了。 push吧你添加的json作为单个元素添加到数组中了。所以就修改了array
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询