Существующие ответы великолепны, но я не могу удержаться от добавления JSON.stringify
версии:
const data = { id: '1', displayName: 'A', children: [ { id: '2', displayName: 'B', children: [ { id: '3', displayName: 'C', children: [] }] }] };
const result = JSON.parse(JSON.stringify(data).replace(/"displayName":/g, '"value":'));
console.log(result);
Очевидно, что это не будет работать, если у вас есть значение, похожее на ключ, поэтому предполагается, что у вас есть гарантия предсказуемых данных.
Если у вас есть несколько замен, вы можете использовать
const data = { id: '1', displayName: 'A', children: [ { id: '2', displayName: 'B', children: [ { id: '3', displayName: 'C', children: [] }] }] };
const swaps = {displayName: "foo", children: "baz", id: "corge"};
const pattern = new RegExp(
Object.keys(swaps).map(e => `(?:"(${e})":)`).join("|"), "g"
);
const result = JSON.parse(
JSON.stringify(data).replace(pattern, m => `"${swaps[m.slice(1,-2)]}":`)
);
console.log(result);
Более традиционным рекурсивным вариантом может быть следующий (все еще предполагается / жесткие коды children
):
const changeKey = (node, keySubs) =>
Object.entries(keySubs).reduce((a, [oldKey, newKey]) => {
a[newKey] = a[oldKey];
delete a[oldKey];
return a;
}, {...node, children: node.children.map(e => changeKey(e, keySubs))})
;
const data = { id: '1', displayName: 'A', children: [ { id: '2', displayName: 'B', children: [ { id: '3', displayName: 'C', children: [] }] }] };
const swaps = {displayName: "label", id: "better id"};
console.log(changeKey(data, swaps));
Итеративный:
const changeKey = (node, keySubs) => {
const result = {children: []};
const stack = [[node, result]];
while (stack.length) {
const [curr, parent] = stack.pop();
const child = Object.entries(keySubs)
.reduce((a, [oldKey, newKey]) => {
a[newKey] = a[oldKey];
delete a[oldKey];
return a;
}, {...curr, children: []})
;
parent.children.push(child);
stack.push(...curr.children.map(e => [e, child]));
}
return result;
};
const data = { id: '1', displayName: 'A', children: [ { id: '2', displayName: 'B', children: [ { id: '3', displayName: 'C', children: [] }] }] };
const swaps = {displayName: "label", id: "better id"};
console.log(changeKey(data, swaps));