Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取JSON对象中元素的路径_Javascript_Json_Search - Fatal编程技术网

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]我不想要对象,但是想要对象的路径我不想要对象,但是想要对象的路径