Извлечение ключей из объекта и вложенного массива - PullRequest
0 голосов
/ 31 мая 2018

У меня есть массив объектов, эти объекты также имеют в некоторых случаях вложенные массивы, которые содержат объекты.

Каждый объект как свойство key, которое мне нужно извлечь.

Примером JSON, с которым я имею дело, является ...

{
"items": [  
   {  
      "key":"main",
      "foo":"bar",
      "children":[  
         {  
            "key":"one",
            "foo":"barboo"
         },
         {  
            "key":"two",
            "foo":"boobaz"
         }
      ]
   },
   {  
      "key":"secondary",
      "foo":"baz",
      "children":[  
         {  
            "key":"one",
            "foo":"barboobaz"
         },
         {  
            "key":"two",
            "foo":"boobazfoo"
         }
      ]
   }
]
}

В настоящее время я сопоставляю items и возвращаю key, затем, где я нахожу детей, я сопоставляю снова возвращая key.

Что-то вроде этого псевдокода ...

class SomeClass {
let contentKeys = []


    extractKeys = navItems => {
        navItems.map(item => this.appendToContentRequest(item));
        return this.contentKeys.join(',');
    };

    appendToContentRequest(item) {
        if (~!this.contentKeys.indexOf(item.key)) {
            this.contentKeys.push(item.key);
        }
        if (item.children) {
            item.children.map(child => this.appendToContentRequest(child));
        }
    }


}

Мне это не нравится, оно кажется очень "хакерским" и не очень функциональным.

Есть лилучший способ достичь этого?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Вы можете использовать нижеприведенную рекурсивную функцию для получения значения любого ключа любого вложенного массива объектов

function extract(array, keyName) {
  return array.reduce((a, b) =>
    a.concat(...Object.keys(b).map(e => e === keyName ? b[e] : (Array.isArray(b[e]) ? extract(b[e], keyName) : null))), []).filter(e => e);
}

console.log(extract(obj.items, 'key'));
<script>
  const obj = {
    "items": [{
        "key": "main",
        "foo": "bar",
        "children": [{
            "key": "one",
            "foo": "barboo"
          },
          {
            "key": "two",
            "foo": "boobaz"
          }
        ]
      },
      {
        "key": "secondary",
        "foo": "baz",
        "children": [{
            "key": "one",
            "foo": "barboobaz"
          },
          {
            "key": "two",
            "foo": "boobazfoo"
          }
        ]
      }
    ]
  }
</script>
0 голосов
/ 31 мая 2018

var data = {
"items": [  
   {  
      "key":"main",
      "foo":"bar",
      "children":[  
         {  
            "key":"one",
            "foo":"barboo"
         },
         {  
            "key":"two",
            "foo":"boobaz"
         }
      ]
   },
   {  
      "key":"secondary",
      "foo":"baz",
      "children":[  
         {  
            "key":"one",
            "foo":"barboobaz"
         },
         {  
            "key":"two",
            "foo":"boobazfoo"
         }
      ]
   }
]
}


 function flatNestedKey(array) {
    var result = [];
    const context = this;
    array.forEach(function (a) {
      result.push(a.key);
      if (Array.isArray(a.children)) {
        result = result.concat(context.flatNestedKey(a.children));
      }
    });
    return result;
  }
  
  var keys = flatNestedKey(data.items);
  console.log(keys);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...