Переименовать все массивы в глубоко вложенном объекте с вложенным массивом массивов

Я создаю рекурсивную функцию «массажа», которой необходимо переименовать определенные ключи свойств. Я пробовал некоторые рекурсивные методы, но пока безрезультатно.

Например, мне нужно удалить слово «Массив» из всех массивов, находящихся внутри этого глубоко вложенного объекта.

Пример ввода:

var input = {
  test: {
    testArray1: [
      {
        testArray2: [
          {
            sample: {
              testArray3: [],
            },
          },
        ],
      },
    ],
  },
};

Ожидаемый результат:

var output = {
  test: {
    test1: [
      {
        test2: [
          {
            sample: {
              test3: [],
            },
          },
        ],
      },
    ],
  },
};
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
104
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Лучшим подходом для этого (без рекурсии) может быть преобразование 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);

Действительно, очень хороший подход.

holydragon 15.01.2019 04:20

Что делать, если слово Array находится в значениях ...?

Yosvel Quintero Arguelles 15.01.2019 04:22

Спасибо, но я узнал об этом от другого пользователя (назовем его CP) в другом ответе, когда в течение 30 минут пытался ответить на вопрос с помощью рекурсивного подхода.

Shidersz 15.01.2019 04:23

@YosvelQuintero Я обновил регулярное выражение для этого случая.

Shidersz 15.01.2019 04:54

Что, если в значениях есть слово Array, за которым следует двоеточие?

Aioros 15.01.2019 05:15

Что ж, в некоторых особых случаях я полагаю, что это не сработает, это просто быстрый подход, но для полного решения, я думаю, должна быть сделана процедура рекурсии.

Shidersz 15.01.2019 05:34

@Shidersz Очень хороший ответ, спасибо

Yosvel Quintero Arguelles 15.01.2019 07:33

Ух ты, умница! Вот почему я не хотел указывать метод как рекурсивный. Просто нужно было такое быстрое решение.

Trevor 15.01.2019 19:05

@Trevor примет во внимание выбор этого ответа как правильного, если вы считаете, что это решение вам подходит.

Shidersz 15.01.2019 19:36

Вот «простой» рекурсивный подход, который должен работать в вашей ситуации:

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;
  }

}

Имейте в виду, что этот подход не очень надежен (а также довольно дорог с точки зрения памяти, если ваш исходный объект очень глубокий).

Другие вопросы по теме