2016-12-30 3 views
2

Я хотел бы найти по определенному ключу на вложенном массиве/объекте на javascript и вернуть всю структуру иерархии, включить его родительский элемент до родительского корня, а также его дочерний элемент. Вот пример JSON:поиск по определенному ключу вложенного объекта/массива javascript

 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

Что вы пробовали себя до сих пор? Покажите нам свой код, чтобы кто-то мог указать на проблему. Это не то место, где можно получить полные ответы на код. – MeanGreen

+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; }

+1

спасибо @nina, это мне очень помогло. Я изменил код, основанный на моей потребности. – ipeh

Смежные вопросы