gpt4 book ai didi

javascript - 将嵌套对象数组扩展到路径数组的最快方法(lodash)

转载 作者:行者123 更新时间:2023-11-29 20:48:27 27 4
gpt4 key购买 nike

我有一个查询语法,需要应用于 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;
}

我特别希望缩短这段时间。

最佳答案

这可以满足您的需求,但并不比您的解决方案简单/短多少。

function getPaths (collection, query) {
let tokens = query.split(".")

function walkPath (collection, [currentToken, ...restTokens], paths) {
if (!currentToken) { // no more tokens to follow
return paths.join(".")
}
if (currentToken === "[]") { // iterate array
const elemPaths = _.range(collection.length)
return elemPaths.map(elemPath => walkPath(collection[elemPath], restTokens, [...paths, elemPath]))
}
else {
return walkPath(collection[currentToken], restTokens, [...paths, currentToken])
}
}

return _.flattenDeep(walkPath(collection, tokens, []))
}

它也缺乏错误处理。
也许这对您有用。

关于javascript - 将嵌套对象数组扩展到路径数组的最快方法(lodash),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53227936/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com