You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含嵌套数组/对象的数组赋值给目标对象的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:27:38