Извлечь массив из массива в виде хэш-таблицы с ключевой переменной массива в Javascript - PullRequest
1 голос
/ 27 сентября 2019

У меня есть массив 'arr', так как у меня есть критерии поиска name = abc.def и мне нужно разделить ('.') Имена, проходящие через все узлы, как показано ниже, сначала поиск name= abc , то должен идти глубже во всех совпадениях, где я должен продолжить со второй части критериев поиска - child name = 'def' (которая фактически является второй частью исходного поискового ключевого слова-"abc.def") Вот данные, через которые я должен пройти:

vars={1.1.1:{"no": "1.1.1","name": "Foo"}}

    let arr = [
            { 
              "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"
                          }
                          ] 
                  }
              ]
          }
        ];

Ожидаемый результат: пройти по иерархии и извлечь информацию обо всех дочерних совпадениях в хеш-таблице. Вывод:

vars={};
vars[1.1.1]={ "no": "1.1.1","name": "Foo"}
vars[1.1.2]={ "no": "1.1.2","name": "jkl"}
...

Например:

1 Ответ

0 голосов
/ 28 сентября 2019

Мы можем использовать String.split () , чтобы разделить path значения для индивидуального доступа к каждому свойству.

Затем мы можем вернуть содержимое конечного массива child какобъект.

let arr = [ { "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" } ] } ] } ];

function findItem(arr, path, vars) {
  var properties = path.split('.').filter(item => item.trim() !== '');
  var value = arr;

  for (let property of properties) {
    if (Array.isArray(value)) {
      value = value.find(item => item.name === property);
    } else if (value && value['child']) {
      value = value.child.find(item => item.name === property);
    }
  }
  
  if (value && value['child']) {
    value.child.forEach(item => {
      vars[item.no] = item;
    });
  }

  return vars;
}

let vars = {};

vars = findItem(arr, "abc.def", vars);

console.log(vars);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...