如何将含嵌套数组/对象的数组赋值给目标对象的categories属性
嘿,这个需求其实挺 straightforward 的,咱们分两种常见场景来实现,确保符合你的实际需求~
解决方案
先把你的两个变量明确出来方便后续操作:
// 你的分类树数组 var category_tree = [ { category_id: 1, name: "A", children: [ { category_id: 2, name:" B, child of A", children: [ { category_id: 3, name: "C, child of B" } ] } ] } ]; // 你的目标状态对象 var targetObj = { categories: [], isFetching: false, isValid: false, currentFilter: "NAME_ASCENDING", displayError: false, errorMessage: "" };
1. 直接浅拷贝赋值(简单场景)
如果你不需要担心后续修改category_tree会影响targetObj.categories,或者就是希望两者共享同一个数据引用,直接赋值就搞定了:
targetObj.categories = category_tree;
这行代码执行后,targetObj.categories就和category_tree指向同一个数组,操作其中一个的顶层元素会同步到另一个(嵌套的子对象本来就是引用类型,不管哪种赋值都会共享,除非用深拷贝)。
2. 深拷贝赋值(避免引用关联)
要是你后续需要单独修改targetObj.categories里的嵌套内容,不想影响原category_tree,那必须用深拷贝——因为普通的浅拷贝(比如扩展运算符[...category_tree])只能复制第一层数组,嵌套的子对象还是共享引用。
方法一:JSON序列化(快速实现)
这种方式适合你的分类树这种没有函数、循环引用的纯JSON数据:
targetObj.categories = JSON.parse(JSON.stringify(category_tree));
优点是不用写额外代码,缺点是无法处理函数、Symbol等特殊类型(不过你的场景完全够用)。
方法二:手写递归深拷贝(更灵活)
如果以后要处理更复杂的数据结构,自己写个深拷贝函数更可控:
function deepCopy(data) { // 非对象类型直接返回 if (typeof data !== 'object' || data === null) { return data; } // 处理数组 if (Array.isArray(data)) { return data.map(item => deepCopy(item)); } // 处理对象 const copied = {}; for (const key in data) { if (data.hasOwnProperty(key)) { copied[key] = deepCopy(data[key]); } } return copied; } // 赋值 targetObj.categories = deepCopy(category_tree);
验证结果
赋值完成后,你可以打印targetObj确认效果:
console.log(targetObj.categories); // 输出结果和原category_tree的嵌套结构完全一致
内容的提问来源于stack exchange,提问作者Daniel Thompson
相关产品推荐
相关产品推荐

