Javascript 获取JSON对象中元素的路径
我有一个对象,如下所示:Javascript 获取JSON对象中元素的路径,javascript,json,search,Javascript,Json,Search,我有一个对象,如下所示: [ { "uid": "aaa-aaa", "name": "foo", "children": [] }, { "uid": "aaa-bbb", "name": "bar", "children": [ { "uid": "aaa-bbc", "name": "baz", "children": [] }, {
[
{
"uid": "aaa-aaa",
"name": "foo",
"children": []
},
{
"uid": "aaa-bbb",
"name": "bar",
"children": [
{
"uid": "aaa-bbc",
"name": "baz",
"children": []
},
{
"uid": "aaa-ccc",
"name": "fooz",
"children": [
{
"uid": "aaa-bcb",
"name": "Yeah !",
"children": []
}
]
}
]
}
]
我正在尝试编写一个函数,该函数将该对象的uid
作为参数,并返回指向该对象中包含uid
的元素的路径(如果未找到该元素,则返回null
)
大概是这样的:
> getElementPath(bigObject, 'aaa-bcb')
[1, "children", 1, "children", 0]
or
> getElementPath(bigObject, 'aaa-bcb')
[1, 1, 0]
我知道函数必须是递归的,因为嵌套级别应该没有限制。我尝试过这个,但它总是返回null
:
函数getElementPath(haystack,uid,currentPath=[]){
如果(haystack.uid==uid){
返回电流路径
}
if(Array.isArray(haystack.children)){
for(设i=0;i平板
展平对象,然后在对象关键点上循环,直到找到具有适当值的关键点。一旦你找到它,关键就是路径
我(天真而快速)的实现是这样的。但我不喜欢的是,它知道查看“children”属性,如果您的数据结构定义良好且不经常更改,则这很好,flat
的想法无论您是否更改数据结构都会起作用
getPathForUid = (uid,obj,thisPath = []) => {
if(Array.isArray(obj)) {
return obj.reduce((acc,item,idx) => getPathForUid(uid,item,thisPath.concat(idx)),[]);
}
return obj.uid === uid ? thisPath : getPathForUid(uid,obj.children,thisPath.concat('children'));
}
我会使用
flat
展平对象,然后在对象关键点上循环,直到找到具有适当值的关键点。一旦你找到它,关键就是路径
我(天真而快速)的实现是这样的。但我不喜欢的是,它知道查看“children”属性,如果您的数据结构定义良好且不经常更改,则这很好,flat
的想法无论您是否更改数据结构都会起作用
getPathForUid = (uid,obj,thisPath = []) => {
if(Array.isArray(obj)) {
return obj.reduce((acc,item,idx) => getPathForUid(uid,item,thisPath.concat(idx)),[]);
}
return obj.uid === uid ? thisPath : getPathForUid(uid,obj.children,thisPath.concat('children'));
}
试试这个:
function getObject(listaJson, uid) {
var object = null,
param,
type = null;
if (listaJson.uid === uid) {
return listaJson;
}
for (param in listaJson) {
type = typeof(listaJson[param]);
if (type.toString().toLowerCase() === 'object') {
object = getObject(listaJson[param], uid);
}
if (object) {
return object;
}
}
return object;
}
console.log(getObject(json, 'aaa-aaa'));
console.log(getObject(json, 'aaa-bbb'));
console.log(getObject(json, 'aaa-bbc'));
console.log(getObject(json, 'aaa-ccc'));
console.log(getObject(json, 'aaa-bcb'));
console.log(getObject(json, 'aaa-xxx')); // null
console.log(getObject(json, 'yyy-jjj')); // null
试试这个:
function getObject(listaJson, uid) {
var object = null,
param,
type = null;
if (listaJson.uid === uid) {
return listaJson;
}
for (param in listaJson) {
type = typeof(listaJson[param]);
if (type.toString().toLowerCase() === 'object') {
object = getObject(listaJson[param], uid);
}
if (object) {
return object;
}
}
return object;
}
console.log(getObject(json, 'aaa-aaa'));
console.log(getObject(json, 'aaa-bbb'));
console.log(getObject(json, 'aaa-bbc'));
console.log(getObject(json, 'aaa-ccc'));
console.log(getObject(json, 'aaa-bcb'));
console.log(getObject(json, 'aaa-xxx')); // null
console.log(getObject(json, 'yyy-jjj')); // null
如果必须经常使用此
getElementPath()
函数,则有必要将数组简化为一个对象,以便直接访问任何元素。这可能会完全消除拥有完整路径的需要。您的“后续对象”是一个数组。作为haystack
传递给函数getElementPath
的数组,然后在第一个条件中haystack.uid==uid
那里haystack
是一个数组,在下一个条件中haystack.children
由于同样的原因未定义。剩下的唯一一条return
语句最终返回null。¯_(ツ)_/“'如果您必须经常使用此getElementPath()
函数,则有必要将数组简化为一个对象,这样您就可以直接访问任何元素。这可能会完全消除拥有完整路径的需要。您的“跟随对象”是一个数组。该数组作为haystack
传递给函数getElementPath
,然后在第一个条件中haystack.uid==uid
那里haystack
是一个数组,在下一个条件中haystack
是一个数组。由于同样的原因,子项未定义。eve只剩下一个返回语句“返回空值。”_(ツ)_/“'似乎是一个很好的解决方案,但如果可能的话,我希望不要在我的项目中添加依赖项(同时,我对我的实现中的错误很好奇)编写更少的代码,使用更多的小型库-您的代码将永远不会像flat
:)那样经过(战斗)测试。我强烈建议使用flat(以及配套库-)如果你正在做大量的对象映射工作,就像我推荐的lodash一样。这是编写更好(更快)软件的一个很好的通用建议但我在这里的目标是自己成为一名更好的程序员。我有足够的时间尝试调试我的实现,我来这里寻求帮助,试图了解它的错误。请注意,我可能最终会使用flat
,但当我能够编写我需要的函数时,我会感觉更好。我发现了我的实现中的错误案例:主对象不应该是数组本身,它应该是一个包含子项的对象。@KiJéy-这是怎么回事?JSON.parse(JSON.stringify(currentPath))
edit:我明白了,你不想改变数组-你可以(应该)只做const newPath=[…currentPath,I]
似乎是一个很好的解决方案,但如果可能的话,我希望不要在我的项目中添加依赖项(同时,我很好奇我的实现中出现了什么问题)编写更少的代码,使用更多的小型库-您的代码将永远不会像flat
:)那样经过(战斗)测试。我强烈建议使用flat(以及配套库-)如果你正在做大量的对象映射工作,就像我推荐lodash一样。这是一个编写更好(更快)软件的好建议,但我的目标是自己成为一名更好的编码员。我有足够的时间尝试调试我的实现,我来这里寻求帮助,试图了解它的错误。请注意,我可能最终会使用flat
,但当我能够编写所需的函数时,我会感觉更好。我发现了我的情况中的错误:主对象不应该是数组本身,它应该是包含子对象
键的对象。@KiJéy-这是怎么回事JSON.parse(JSON.stringify(currentPath))
edit:我明白了,你不想改变数组-你可以(应该)只做constnewpath=[…currentPath,I]代码>我不想要对象,但是想要对象的路径我不想要对象,但是想要对象的路径