通过嵌套对象/数组javascript的特定键进行搜索

时间:2016-12-30 09:37:17

标签: javascript object search nested

我想在javascript上搜索嵌套数组/对象上的特定键,并且需要返回所有层次结构,包括它的父级直到root父级以及它的子级。 以下是json示例:

        let array = [
        { 
          "no": "1",
          "name": "abc",
          "child" : [
              { 
                  "no": "1.1",
                  "name": "def",
                  "child" : [
                      {
                          "no": "1.1.1",
                          "name": "Foo"
                      },
                      {
                          "no": "1.1.2",
                          "name": "jkl"
                      }
                      ] 
              },
              { 
                  "no": "1.2",
                  "name": "Foo",
                  "child" : [
                      {
                          "no": "1.2.1",
                          "name": "Foo"
                      },
                      {
                          "no": "1.2.2",
                          "name": "aaaaaaa"
                      }
                      ] 
              }
          ]
          },
       { 
          "no": "2",
          "name": "abc2",
          "child" : [
              { 
                  "no": "2.1",
                  "name": "Foo",
                  "child" : [
                      {
                          "no": "1.1.1",
                          "name": "ghi"
                      },
                      {
                          "no": "1.1.2",
                          "name": "jkl"
                      }
                      ] 
              },
              { 
                  "no": "2.2",
                  "name": "ghssssi",
                  "child" : [
                      {
                          "no": "2.2.1",
                          "name": "ghssssi"
                      },    
                      {
                          "no": "2.2.2",
                          "name": "asass"
                      }
                      ] 
              }
          ]
      }
    ];

当我们想要按键=' Foo'进行搜索时,结果会是这样的:

        array_result = [
      { 
          "no": "1",
          "name": "abc",
          "child" : [
              { 
                  "no": "1.1",
                  "name": "def",
                  "child" : [
                      {
                          "no": "1.1.1",
                          "name": "Foo"
                      }
                      ] 
              },
              { 
                  "no": "1.2",
                  "name": "Foo",
                  "child" : [
                      {
                          "no": "1.2.1",
                          "name": "Foo"
                      }
                      ] 
              }
          ]
      },
       { 
          "no": "2",
          "name": "abc2",
          "child" : [
              { 
                  "no": "2.1",
                  "name": "Foo",
                  "child" : [
                      {
                          "no": "1.1.1",
                          "name": "ghi"
                      },
                      {
                          "no": "1.1.2",
                          "name": "jkl"
                      }
                      ] 
              }
          ]
      }
    ];

我确定它需要递归功能。有人有意见吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

您可以从原始数组中获取副本并过滤数组,如果它具有所需值或子项具有值。



var array = [{ no: "1", name: "abc", children: [{ no: "1.1", name: "def", children: [{ no: "1.1.1", name: "Foo" }, { no: "1.1.2", name: "jkl" }] }, { no: "1.2", name: "Foo", children: [{ no: "1.2.1", name: "Foo" }, { no: "1.2.2", name: "aaaaaaa" }] }] }, { no: "2", name: "abc2", children: [{ no: "2.1", name: "Foo", children: [{ no: "1.1.1", name: "ghi" }, { no: "1.1.2", name: "jkl" }] }, { no: "2.2", name: "ghssssi", children: [{ no: "2.2.1", name: "ghssssi" }, { no: "2.2.2", name: "asass" }] }] }],
    find = 'Foo',
    result = JSON.parse(JSON.stringify(array)).filter(function search(a) {
        var children;
        if (a.name === find) {
            return true;
        }
        if (!Array.isArray(a.children)) {
            return false;
        }
        children = a.children.filter(search);
        if (children.length) {
            a.children = children;
            return true;
        }
    });

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }