Получить все свойства объекта
Существует объект 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)));
выпадает ошибка, указанная выше.