关于JavaScript对象数组深拷贝 浅拷贝问题

想实现的目的

遍历一个数组,数组的元素是对象,是一个树形结构。如果数组元素的PID是某个值,就将该元素的checked属性设为true

for(var i=0;i<initdata.length;i++){
    if($.inArray(initdata[i].id, subjectids) > -1){
         initdata[i].checked=true;
         if(parseInt(initdata[i].isleaf) === 0){
              initdata = checkNode(initdata,initdata[i].id);
         }
    }else{
         initdata[i].checked=false;
    }
}
function checkNode(initdata,pid){
        for(var j=0;j<initdata.length;j++){
            if(parseInt(initdata[j].pid) === parseInt(pid)){
                initdata[j].checked = true;
            }
        }
        return initdata;
    }

数据结构如下

0:
checked: true
id: "5001"
isleaf: "0"
level: "1"
name: "主营业务收入"
open: true
pid: "5"
__proto__: Object
1:
checked: false
id: "500101"
isleaf: "1"
level: "2"
name: "服务收入"
open: true
pid: "5001"
__proto__: Object
2:
checked: false
id: "500102"
isleaf: "1"
level: "2"
name: "销售收入"
open: true
pid: "5001"
__proto__: Object
3:
checked: true
id: "5051"
isleaf: "1"
level: "1"
name: "其他业务收入"
open: true
pid: "5"
__proto__: Object

直接操作initdata,最后的结果,checked没有被设置为true【数据没有问题】

希望大神指点,大概知道是JS的深拷贝,浅拷贝的问题,不知道怎么解决

阅读 1.6k
2 个回答

把else代码去掉就好了,本来for循环的第一次,四条数据都被改为true了,但是接着第二条数据经过if($.inArray(initdata[i].id, subjectids) > -1)判断为false,所以被else 重新将checked 值改为了false.数据本身值就是false,所以把这个去掉,既满足需求,也就解决了问题

function checkNode (initdata, pid) {
  const init = initdata.find((init) => init.pid === pid);
  init.checked = true;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题