Вы можете использовать Array.prototype.flatMap
для этого -
const d =
{userName:[],email:[],name:{fullName:[],split:{first:[],last:[]}},date:{input:{split:{month:[],year:[]},full:[]},select:{month:[],year:[]}}}
const main = (o = {}, path = []) =>
Array.isArray(o) || Object(o) !== o
? [ path ]
: Object
.entries(o)
.flatMap(([ k, v ]) => main(v, [...path, k ]))
console.log(main(d))
Выход
[ [ "userName" ]
, [ "email" ]
, [ "name", "fullName" ]
, [ "name" ,"split", "first" ]
, [ "name", "split", "last" ]
, ...
]
Если вы хотите, чтобы пути были "a.b.c"
вместо [ "a", "b", "c" ]
, используйте .map
и Array.prototype.join
-
const d =
{userName:[],email:[],name:{fullName:[],split:{first:[],last:[]}},date:{input:{split:{month:[],year:[]},full:[]},select:{month:[],year:[]}}}
const main = (o = {}, path = []) =>
Array.isArray(o) || Object(o) !== o
? [ path ]
: Object
.entries(o)
.flatMap(([ k, v ]) => main(v, [...path, k ]))
console.log(main(d).map(path => path.join(".")))
Выход
[
"userName",
"email",
"name.fullName",
"name.split.first",
"name.split.last",
"date.input.split.month",
"date.input.split.year",
"date.input.full",
"date.select.month",
"date.select.year"
]
If you do not want to rely on Array.prototype.flatMap
because it is not supported in your environment, you can use a combination of Array.prototype.reduce
and Array.prototype.concat
-
const d =
{userName:[],email:[],name:{fullName:[],split:{first:[],last:[]}},date:{input:{split:{month:[],year:[]},full:[]},select:{month:[],year:[]}}}
const main = (o = {}, path = []) =>
Array.isArray(o) || Object(o) !== o
? [ path ]
: Object
.entries(o)
.reduce // <-- manual flatMap
( (r, [ k, v ]) =>
r.concat(main(v, [...path, k ]))
, []
)
console.log(main(d).map(path => path.join(".")))
Или вы можете полифилл Array.prototype.flatMap
-
Array.prototype.flatMap = function (f, context)
{ return this.reduce
( (r, x, i, a) => r.concat(f.call(context, r, x, i, a))
, []
)
}
Есть ли способ получить доступ к значению любого из этих свойств? Например. "d.name.split.first"
используя возвращенный массив в позиции 3?
Мы можем написать функцию поиска, которая принимает объект, o
, и строку, разделенную точками, s
, которая возвращает значение, если это возможно, иначе возвращает undefined
, если s
недостижимо -
const d =
{userName:[],email:[],name:{fullName:[],split:{first:[],last:[]}},date:{input:{split:{month:[],year:[]},full:[]},select:{month:[],year:[]}}}
const lookup = (o = {}, s = "") =>
s
.split(".")
.reduce
( (r, x) =>
r == null ? undefined : r[x]
, o
)
console.log(lookup(d, "name.split"))
// { first: [], last: [] }
console.log(lookup(d, "name.split.first"))
// []
console.log(lookup(d, "name.split.zzz"))
// undefined
console.log(lookup(d, "zzz"))
// undefined
person
Mulan
schedule
03.09.2019