Общий способ преобразовать все экземпляры NULL в неопределенные в Typescript - PullRequest
0 голосов
/ 16 мая 2018

Я хочу написать функцию, которая преобразует все экземпляры свойства любого объекта с нулевым в неопределенное.Многие из моих объектов имеют вложенные объекты в виде свойств или массивов значений / объектов.

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

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

Мне не удалось найти простой способ получить неизвестное количество универсальных типов, поэтому я подумал, что мне придется везде использовать любой тип.Есть ли способ обойти это?

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

Проблемы / вопросы, которые мне нужно решить / ответить:

  1. Должен ли я использовать Generics или Any?
  2. Еслия использую дженерики, есть ли способ динамически назначать новые дженерики при обнаружении нового типа?
  3. Есть ли в машинописи более простой способ рекурсивного разбора объектов?

Мой текущий подходчто-то вроде:

inputObjectKeys.map(key, index) =>

, тогда есть функция, которая преобразует ноль в неопределенное, игнорирует не-объектные типы и рекурсивно, если это объект.

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

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Ну, мой ответ не симпатичный, но вот что я получил, чтобы работать на меня:

function recurseObject(obj: any) {

    if (obj === null) {
        return undefined;

    } else if (typeof obj !== 'object') {
        return obj;

    } else {

    if (obj instanceof Array) {
        for (let key of obj) {
            recurseObject(key);
    }

    } else {
            for (let key in obj) {

                if (obj[key] === null) {
                    obj[key] = undefined;

                } else if (typeof obj[key] === 'object') {
                    recurseObject(obj[key]);
                }
            }
        }
    }

    return obj;
}
0 голосов
/ 16 мая 2018

Вы можете использовать значения типа truey.Используйте оператор !! для преобразования значения в истинное значение типа.

if(!!array[0]) { ... } //If array[0] contains a 'truthy' value, e.g. true, 1, not null, not undefined, etc
...