LINUX.ORG.RU

Javascript вытащить свойста объекта (со вложенными объектами) в массив

 , ,


0

1

Всем привет!

Кто в алгоритмах шарит кто? Подскажите, пожалуйста, как вытащить ключи объекта, который может содержать в себе объекты бесконечной вложенности, в массив.

Например, если есть объект:

var obj = {
    field_1: 'value 1',
    field_2: {
        ffield_1: {fffield_1: 1}
    }

На выходе должен получиться массив:

['field_1', 'field_2', 'ffield_1', 'fffield_1']



Последнее исправление: djnoob (всего исправлений: 1)

Ответ на: комментарий от Vit

Чет, вы не то дали.

Там метод разворачивает строку в объект и присваивает свойствам объекта переданные в массиве значения, на выходе получем уже «развернутый» объект со значениями.

А мне нужно на вход подать объект (со вложенностями), а на выходе получить массив из всех свойств объекта.

djnoob
() автор топика

man рекурсия

anonymous
()
Ответ на: комментарий от djnoob

А, точно. Тогда стоит посмотреть исходники вот этого https://lodash.com/docs#flatMapDepth и упростить под себя.

Ничего особо сложного в том чтобы рекурсивно пробежаться по объекту нет, просто есть нюансы с проверкой типов, если попадутся какие-нибудь типизированные массивы. Поэтому для изучения подобных вещей советую всегда в исходники лодаша заглядывать.

Vit ★★★★★
()
function getKeys(obj) {                                                                                                                                
  return Object.keys(obj).map((key, i, keys) => {                                                                                                      
    if (typeof obj[key] !== 'object') return key;                                                                                                      
    return [key, getKeys(obj[key])];                                                                                                                   
  });                                                                                                                                                  
}                                                                                                                                                      
var Keys = flattenDeep(getKeys(obj));
mystery ★★
()
Последнее исправление: mystery (всего исправлений: 1)

Как-то не вкурил, что вопрос больше по разворачиванию рекурсии, а не по яваскрипту. Вот, сляпал пример без сохранения порядка ключей (код не проверял):

flattenKeys(obj) {
  let stacked = [ obj ];
  let result = [];

  for(;;) {
    if (!stacked.length) break;

    o = stacked.pop();

    let keys = Object.keys(o).forEach(k => {
      result.push(k);

      if (typeof o[k] === 'object') stacked.push(o[k]);
    });
  }

  return result;
}


Если порядок ключей важен - значит надо в очередь пихать не объект, а пары [ key, value ], все подряд. При выгребании, если найден объект - раскладывать его на пары, пихать в очередь и переходить в начало цикла.

Vit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.