Вот общая c рекурсивная map
функция, которую я написал в недавнем ответе -
const map = (fk = identity, fv = identity, x = null) =>
Array.isArray(x)
? x.map(v => map(fk, fv, v))
: Object(x) === x
? Object.fromEntries(
Object.entries(x).map(([ k, v ]) =>
[ fk(k)
, map(fk, fv, v)
]
)
)
: fv(x)
Функции высшего порядка особенно полезны, потому что их можно использовать в много практических способов -
const keyReplacer = (k = "") =>
{ if (k === "title") return "text"
if (k === "children") return "items"
else return k
}
const objs = // <-- don't forget const keyword
{ ... }
const result =
map(keyReplacer, identity, objs)
// => ...
Запустите приведенный ниже фрагмент, чтобы увидеть результат -
const identity = x =>
x
const map = (fk = identity, fv = identity, x = null) =>
Array.isArray(x)
? x.map(v => map(fk, fv, v))
: Object(x) === x
? Object.fromEntries(
Object.entries(x).map(([ k, v ]) =>
[ fk(k)
, map(fk, fv, v)
]
)
)
: fv(x)
const objs = // <-- don't forget const keyword
{one:{title:"bla",amount:5,children:[{title:"bla",identifier:"some text"},{title:"bla2",identifier:"some text2"}]},two:{title:"bla",amount:5,children:[{title:"bla",identifier:"some text"},{title:"bla2",identifier:"some text2"}]}}
const keyReplacer = (k = "") =>
{ if (k === "title") return "text"
if (k === "children") return "items"
else return k
}
const result =
map(keyReplacer, identity, objs)
console.log(result)
Очевидным улучшением этого является замена линейного if
стека логарифмическим c поиском по словарю -
const keyReplacer = (dict = {}) => (k = "") =>
{ const r = dict[k]
return r === undefined ? k : r
}
const replacements =
{ title: "text", children: "items" }
const result =
map(keyReplacer(replacements), identity, objs)