Получить сглаженные ключи от объекта, который может содержать функцию - PullRequest
0 голосов
/ 07 ноября 2019

Это функция, которую я нашел для создания плоских клавиш, например

    const keys = flattenKeys({a: { b: 1, c: 1}});

Возвращает

{ 'a.b': 1, 'a.c': 1 }

Но для этого ввода

const keys = flattenKeys({a: { b: 1, c: () => {}}});

Это дает мне

{ 'a.b': 1 }

Как мы видим, a.c отсутствует

export const flattenKeys = (obj: Record<string, any> | any[], path: string[] = []) =>
  !isObject(obj) ? { [path.join('.')]: obj } : reduce(obj, (cum, next, key) => merge(cum, flattenKeys(next, [...path, key])), {});

Я пытался добавить !isObject(obj) && isFunction(obj) ..., но, похоже, не работает

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

{
 'a.b': 1,
 'a.c': () => {}
}

@ Редактировать: isObject, уменьшить, объединение происходит из lodash пакет

1 Ответ

2 голосов
/ 07 ноября 2019

Измените !isObject(obj) ? на !isPlainObject(obj) ?, чтобы исключить только простые объекты:

const flattenKeys = (obj: Record < string, any > | any[], path: string[] = []) =>
  !_.isPlainObject(obj) ? {
    [path.join('.')]: obj
  } : _.reduce(obj, (cum, next, key) => _.merge(cum, flattenKeys(next, [...path, key])), {});

const keys = flattenKeys({
  a: {
    b: 1,
    c: () => {}
  }
});

console.log(keys);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
...