У меня есть синтаксис запроса, который необходимо применить к объекту json и вернуть массив допустимых путей в объекте json.
Например, с запросом как таковым:
People.[].Dependents.[]
И следующий объект JSON:
{
"People": [
{
"FirstName": "John",
"LastName": "Doe",
"Dependents": [
{
"Name": "John First Dep"
},
{
"Name": "John Second Dep"
}
]
},
{
"FirstName": "Jane",
"LastName": "Smith",
"Dependents": [
{
"Name": "Jane First Dep"
}
]
}
]
}
Результат будет:
[
"People.0.Dependents.0",
"People.0.Dependents.1",
"People.1.Dependents.0",
]
В настоящее время я пытаюсь сделать это максимально лаконично. Любая попытка, которую я предпринял до настоящего времени, приводила к слишком большому количеству кода, и за ним невероятно трудно следовать Я что-то упускаю из виду?
Редактировать: Текущий код:
function expandQuery(data, path) {
const parts = path.split("[]").map(s => _.trim(s, "."));
const [outer, ...right] = parts;
const inner = _.join(right, ".[].");
let groupData = _.get(data, outer, []);
if (!_.isArray(groupData)) {
groupData = [groupData];
}
const groupLength = groupData.length;
let items = [];
for (let ind = 0; ind < groupLength; ind++) {
items.push(outer + "." + ind.toString() + "." + inner);
}
const result = [];
for (let ind = 0; ind < items.length; ind++) {
const item = items[ind];
if (item.includes("[]")) {
result.push(...expandQuery(data, item));
} else {
result.push(_.trim(item, "."));
}
}
return result;
}
Я специально ищу, чтобы сделать это короче.