Как вы получаете результаты из глубокого объекта JavaScript? - PullRequest
0 голосов
/ 29 апреля 2018

ожидаемый результат: ["человек", "голова", "глаз"]

ех.

const data = {
  name: "human",
  children: [
    {
      name: "head",
      children: [
        {
          name: "eye"
        }
      ]
    },
    {
      name: "body",
      children: [
        {
          name: "arm"
        }
      ]
    }
  ]
}
const keyword = "eye"

Использование вышеуказанных данных и использование функции f для получения результата

expect_result = f(data)

Какую функцию я должен написать?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

Вы можете использовать итеративный и рекурсивный подход, проверив свойство или вложенные дочерние элементы на требуемое значение. Если найдено, отмените имя на наборе результатов.

function getNames(object, value) {
    var names = [];
    [object].some(function iter(o) {
        if (o.name === value || (o.children || []).some(iter)) {
            names.unshift(o.name);
            return true;
        }
    });
    return names;
}

var data = { name: "human", children: [{ name: "head", children: [{ name: "eye" }] }, { name: "body", children: [{ name: "arm" }] }] };

console.log(getNames(data, 'eye'));
console.log(getNames(data, 'arm'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 29 апреля 2018
var result = []   // This is outside the function since it get updated

function f(data) {
result.push(data.name);    // Add the only name to the Array

if (data.children) {   // just checking to see if object contains key children (staying safe)

for (var i = 0; i < data.children.length; i++) {  // we are only looping through the children

   f(data.children[i]);   // Call this particular function to do the same thing again

 }

}
}

В основном эта функция задает имя. Затем выполните цикл по номеру дочерних элементов и затем вызовите функцию, чтобы установить имя этого дочернего элемента, а затем выполните цикл по его дочерним элементам. Которые оказываются реперкуссионной функцией до тех пор, пока она не закончится по порядку, все они

0 голосов
/ 29 апреля 2018

Попробуйте рекурсивную функцию

const getData = items => {
   let fields = [];

   for (const item of items) {
     if (item.name) {
       fields.push(item.name);
     }

      if (Array.isArray(item.children)) {
        fields.push(...getData(item.children));  
      }
   }

   return fields;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...