Получить все свойства объекта

Рейтинг: 0Ответов: 0Опубликовано: 09.04.2023

Существует объект obj. Он может являться Object и Array. Мне нужно получить все свойства obj, включая возможные внутренние объекты / массивы. Вложенность изначально не определена.

Вот пример функции, которая это делает:

f(obj, parentKey = '') {
      let result;
      if (_.isArray(obj)) {
        let idx = 0;
        result = _.flatMap(obj, function (obj) {
          return this.f(obj, (parentKey || '') + '[' + idx++ + ']');
        });
      }
      else if (_.isPlainObject(obj)) {
        result = _.flatMap(_.keys(obj), function (key) {
          return _.map(this.f(obj[key], key), function (subkey) {
            return (parentKey ? parentKey + '.' : '') + subkey;
          });
        }.bind(this));
      }
      else {
        result = [];
      }
      return _.concat(result, parentKey || []);
    }

В эту функцию передается obj, у которого я беру свойства. Далее с помощью lodash и функции pick я получаю новый объект на основе другого объекта и полученных свойств из obj с помощью функции f.

Вопрос заключается в том, правильно ли функция написана?

Причина вопроса 1: При передаче следующего аргумента obj

purchasestoplistnotice: {
purchaseinfo: {
    purchcode: '',
    comments: ''
    }
}

Получаю:

0: "purchasestoplistnotice.purchaseinfo.purchcode"
1: "purchasestoplistnotice.purchaseinfo.comments"
2: "purchasestoplistnotice.purchaseinfo"
3: "purchasestoplistnotice"

А не:

0: "purchasestoplistnotice.purchaseinfo.purchcode"
1: "purchasestoplistnotice.purchaseinfo.comments"

Причина вопроса 2: При передаче Array в качестве obj. Выходит ошибка на строчке _.flatMap(obj, ...): TypeError: Cannot read properties of undefined (reading 'f').

Использовать функцию можно следующим образом:

const schema1 = ['a', 'b'];
const schema2 = {'a': 1, 'b': 2};
              
const newObj = {
    a: 1,
    b: 2,
    o2: {
        arr: [
            "a2",
            "b2"
        ],
        g: "asd"
    }
}

console.log(this.f(schema1));
console.log(this.f(schema2));

console.log(_.pick(newObj, this.f(schema1)));
console.log(_.pick(newObj, this.f(schema2)));

Примеры в Console: Для console.log(this.f(schema2)); и console.log(_.pick(newObj, this.f(schema2)));

[
    "a",
    "b"
]
{
    "a": 1,
    "b": 2
}

Для console.log(this.f(schema1)); и console.log(_.pick(newObj, this.f(schema1))); выпадает ошибка, указанная выше.

Ответы

Ответов пока нет.