【问题标题】:JavaScript assign array with nested arrays/objects as the attribute of another object [duplicate]JavaScript将具有嵌套数组/对象的数组分配为另一个对象的属性[重复]
【发布时间】:2018-09-23 12:45:25
【问题描述】:

我有一个包含嵌套数组的对象的数组,如下所示:

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",
                    }
                ]
            }

        ]
    }
]

我想取另一个像这样的对象:

{ 
    categories: []
    isFetching: false, 
    isValid: false, 
    currentFilter: "NAME_ASCENDING", 
    displayError: false, 
    errorMessage: ""
}

并将categories 属性设置为等于此 category_tree 对象。

不幸的是,无论我尝试什么,我都失去了孩子们的一切:

{ 
    categories: [{
        category_id: 1,
        name: "A",
        children: []
    }],
    isFetching: false, 
    isValid: false, 
    currentFilter: "NAME_ASCENDING", 
    displayError: false, 
    errorMessage: ""
}

这就是我的问题:如何将嵌套数组/对象分配为对象的属性?

编辑:我尝试过的:

let newState = Object.assign({}, state, {                                                 
        isFetching: false,                                                                    
        valid: true,   
        categories: category_tree                                                   
    })

let newState = Object.assign({}, state, {
    isFetching: false,
    valid: true
})
newState.categories = category_tree

想要的结果:

{ 
    categories: [
        {
            category_id: 1,
            name: "A",
            children: [
                {
                    category_id: 2,
                    name:" B, child of A",
                    children: [
                        {
                            category_id: 3,
                            name: "C, child of B",
                        }
                    ]
                }

            ]
        }
    ],
    isFetching: false, 
    isValid: false, 
    currentFilter: "NAME_ASCENDING", 
    displayError: false, 
    errorMessage: ""
}

【问题讨论】:

  • 请添加您尝试过的内容。和想要的结果。
  • @NinaScholz 我已编辑答案以显示更多详细信息
  • newCat.categories = category_tree.slice(0); 修正错别字后
  • 在这种情况下,Slice 似乎仍然丢失了对象:console.log(category_tree.slice(0)) 表明数组是空的。但是,_.cloneDeep(category_tree) 维护对象,但是当我尝试将其分配给 newState 时,它​​们仍然丢失,即。 newState.categories = _.cloneDeep(category_tree)
  • @mplungjan 我知道问题是相似的;但我不清楚如何处理嵌套在我正在复制的数组中的对象中的数组。我实际上知道如何复制对象数组,但是对象数组和对象数组似乎是问题所在。这是 JavaScript 的不合理用例吗?没想到会这么麻烦,也许我应该重新设计 API 以发送更多平面数据。

标签: javascript


【解决方案1】:

我已取消删除以表明该切片似乎可以执行您想要的操作

newCat.categories = category_tree.slice(0);

像这样

var category_tree = [{
  category_id: 1,
  name: "A",
  children: [{
      category_id: 2, // added a comma
      name: " B, child of A",
      children: [{
        category_id: 3,
        name: "C, child of B",
      }]
    }

  ]
}]

var newCat = {
  categories: [], // added a comma
  isFetching: false,
  isValid: false,
  currentFilter: "NAME_ASCENDING",
  displayError: false,
  errorMessage: ""
}

newCat.categories = category_tree.slice(0)

console.log(JSON.stringify(newCat,null, 2));

【讨论】:

  • 对错别字表示抱歉;至于解决方案,那不是只适用于类别中的一个索引吗?我想要做的是将整个数组重新分配给这个新数组(在示例中只有一个对象,但可能有很多)
  • 啊哇你是对的,对不起。在下一行的环境中,我正在返回这个对象,并且它一定是在我无意中改变对象的行中进行的一些操作,导致我的控制台日志指向一个带有清空子对象的对象(无论出于何种原因)。看来我没能写出优质的功能代码。
  • 非常感谢,您真好!
  • 没问题,不客气:)
猜你喜欢
  • 2021-12-07
  • 2015-12-14
  • 2020-02-21
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2021-11-17
  • 1970-01-01
相关资源
最近更新 更多