【发布时间】:2016-08-08 06:19:46
【问题描述】:
以下函数将对象附加到嵌套数组中(通过递归搜索):
function appendDeep (arr, obj, newObj) {
if (arr.indexOf(obj) !== -1) {
arr.splice(arr.indexOf(obj) + 1, 0, newObj)
} else {
arr.map(item => {
if (item.children) spliceDeep(item.children, obj)
})
}
}
例子:
const colors = {
children: [
{
name: 'white',
},
{
name: 'yellow',
children: [
{
name: 'black'
}
]
}
]
}
const color = {
name: 'black'
}
const newColor = {
name: 'brown'
}
appendDeep(colors.children, color, newColor)
结果:
children: [
[
{
name: 'white',
},
{
name: 'yellow',
children: [
{
name: 'black'
},
{
name: 'brown'
}
]
}
]
]
如您所见,appendDeep 返回一个副作用;它修改了arr。所以我决定改为返回数组(这样函数就会变成纯函数):
function findDeep (arr, obj) {
if (arr.indexOf(obj) !== -1) {
console.log(arr)
return arr
} else {
arr.map(item => {
if (item.children) findDeep(item.children, obj)
})
}
}
并像这样使用新功能:
const newArr = findDeep(colors.children, color)
newArr.splice(newArr.indexOf(color) + 1, 0, newColor)
但我收到此错误:
bundle.js:19893 Uncaught TypeError: Cannot read property 'splice' of undefined
我做错了什么?
(注意:这里是CodePen。)
(注 2:console.log(arr) 确实返回嵌套的子级。但由于某种原因,它们在函数之外变成了undefined。)
【问题讨论】:
-
请将
color和newColor更改为有效对象。请也添加想要的结果。 -
@NinaScholz 好的,我进行了更改。
-
colors.children是一个包含一个项目的数组,它是另一个数组。这可能不是您想要的,当然也不是您的代码所期望的。 -
@Arjan 你是对的。我更新了问题和示例。
标签: javascript recursion functional-programming