说明你的totaltab里的每一个元素的每一个元素实际上是同一个元素,比如
let obj = { a: 1 };
let arr = [obj, obj, obj];
arr.forEach(v => console.log(v));
arr[0].a = 2;
arr.forEach(v => console.log(v));
如果你说执行totaltab[0].contactdata = 1只会让totaltab[0].contactdata变成1而不会让totaltab[1].contactdata也变成1,那只能说明totaltab[0] != totaltab[1],而不能说明totaltab[0].contactdata[i][j] != totaltab[k].contactdata[m][n],你执行这段代码验证一下:
console.log(totaltab[0].contactdata[0][0] == totaltab[0].contactdata[0][1]);
console.log(totaltab[0].contactdata[0][0] == totaltab[1].contactdata[0][0]);
以后要把你的代码文本贴出来,不要只贴截图,这样别人才能把你的代码复制出来测试
我自己写了一段测试代码:
let totaltab = [
{
Extra: null,
contactdata: [
[
{
state: 2
},
{
state: -1
},
{
state: -2
},
{
state: 1
}
],
[
{
state: -5
},
{
state: 2
},
{
state: -4
},
{
state: 0
}
]
]
},
{
Extra: null,
contactdata: [
[
{
state: -2
},
{
state: -1
},
{
state: -2
},
{
state: 1
}
],
[
{
state: 3
},
{
state: -2
},
{
state: 1
},
{
state: 0
}
]
]
}
];
let tabtarget = totaltab[0].contactdata;
tabtarget.forEach(item => {
item.forEach(items => {
items.state = items.state >= 1 ? 0 : items.state;
});
});
console.log(JSON.stringify(totaltab, ' ', 2));
结果自己看,没有任何问题。
但如果你的每个items实际上都相等的话,就会出现你说的情况:
let item = { state: 2 };
let totaltab = [
{
Extra: null,
contactdata: [
[ item, item, item, item ],
[ item, item, item, item ],
]
},
{
Extra: null,
contactdata: [
[ item, item, item, item ],
[ item, item, item, item ],
]
}
];
let tabtarget = totaltab[0].contactdata;
tabtarget.forEach(item => {
item.forEach(items => {
items.state = items.state >= 1 ? 0 : items.state;
});
});
console.log(JSON.stringify(totaltab, ' ', 2));
另外你可能注意到了,我写的后面的那段遍历的代码和你的不太一样,但我的代码和你的是等效的,你的会更绕一点。而且js里的变量什么的一般用小驼峰命名,推荐使用totalTab和tabTarget而不是totaltab和tabtarget,短标识符你连着全小写没关系,长了就很难看了。而且你两层遍历的变量名看起来也不太符合逻辑,item是个数组,而它的元素叫items,看着很难受。