次の関数は(再帰的にそれを検索して)ネストされた配列にオブジェクトを追加:次の再帰関数を純粋な関数にするには?
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さて、私は変更を加えました。 – alexchenco
'colors.children'は1つの項目を含む配列です。これは別の配列です。これはおそらくあなたが望むものではなく、コードが期待しているものではありません。 – Arjan