Я создаю рекурсивную функцию «массажа», которой необходимо переименовать определенные ключи свойств. Я пробовал некоторые рекурсивные методы, но пока безрезультатно.
Например, мне нужно удалить слово «Массив» из всех массивов, находящихся внутри этого глубоко вложенного объекта.
Пример ввода:
var input = {
test: {
testArray1: [
{
testArray2: [
{
sample: {
testArray3: [],
},
},
],
},
],
},
};
Ожидаемый результат:
var output = {
test: {
test1: [
{
test2: [
{
sample: {
test3: [],
},
},
],
},
],
},
};



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Лучшим подходом для этого (без рекурсии) может быть преобразование JSON в string с помощью JSON.stringify(), выполнение некоторых операций с replace() на string и преобразование его обратно в JSON с помощью JSON.parse(), например:
const input = {
test: {testArray1: [
{testArray2: [
{sample: {testArray3: ["Array"],},},
],},
],},
};
let res = JSON.stringify(input).replace(/(Array)([^:]*):/g, "$2:");
res = JSON.parse(res);
console.info(res);Что делать, если слово Array находится в значениях ...?
Спасибо, но я узнал об этом от другого пользователя (назовем его CP) в другом ответе, когда в течение 30 минут пытался ответить на вопрос с помощью рекурсивного подхода.
@YosvelQuintero Я обновил регулярное выражение для этого случая.
Что, если в значениях есть слово Array, за которым следует двоеточие?
Что ж, в некоторых особых случаях я полагаю, что это не сработает, это просто быстрый подход, но для полного решения, я думаю, должна быть сделана процедура рекурсии.
@Shidersz Очень хороший ответ, спасибо
Ух ты, умница! Вот почему я не хотел указывать метод как рекурсивный. Просто нужно было такое быстрое решение.
@Trevor примет во внимание выбор этого ответа как правильного, если вы считаете, что это решение вам подходит.
Вот «простой» рекурсивный подход, который должен работать в вашей ситуации:
function removeWord(input, word = "Array") {
if (Array.isArray(input)) {
return input.map(obj => removeWord(obj, word));
} else if (typeof input == "object") {
var result = {};
Object.keys(input).forEach(key => {
result[key.replace(word, "")] = removeWord(input[key]);
});
return result;
} else {
return input;
}
}
Имейте в виду, что этот подход не очень надежен (а также довольно дорог с точки зрения памяти, если ваш исходный объект очень глубокий).
Действительно, очень хороший подход.