Зацикливание объекта внутри объекта в vanilla JS - PullRequest
0 голосов
/ 25 марта 2019

Я получил результат Json как прикрепленный. Это объект с объектами внутри. Я преобразовал основной объект в массив, и теперь я могу зациклить его без каких-либо проблем. Однако я не могу получить информацию внутри внутреннего объекта. Кстати, внутри объекта я могу получить любое количество подобъектов, от 0 до неопределенного.

Мне нужно использовать это в проекте Vue. Но так как это простой JS, я сделал файл только для целей тестирования. Если это работает в JS, я могу заставить его работать в Vue.

Я пытался преобразовать объект в массив (который работает и включен в код), но я не могу выполнить цикл и преобразовать снова.

let dados = {
  et1: {
      at:"Lorem ipsum dolor sit amet, consectetur",
      st:"Done",
      di:"01/19",
      df:"03/19",
      vl:"10000",
    sub1:{
      at:"Integer ligula purus, convallis convallis",
      st:"Done",
      di:"01/19",
      df:"03/19",
      vl:"8000" 
    },
    sub2:{
      at:"Mauris felis tellus, ullamcorper eu",
      st:"Done",
      di:"01/19",
      df:"03/19",
      vl:"2000" 
    }
  },
  et2: {
      at:"Nunc in urna ultricies sapien",
      st:"Post",
      di:"01/19",
      df:"03/19",
      vl:"40000"
  },
  et3: {
      at:"Phasellus varius rhoncus urna, nec",
      st:"Execution",
      di:"01/19",
      df:"03/19",
      vl:"4000",
    sub1:{
      at:"Phasellus varius rhoncus urna, nec",
      st:"Execution",
      di:"01/19",
      df:"03/19",
      vl:"2000" 
    }
  }
}

console.log(dados)

Object.entries(dados).forEach(([key, value]) => {
 console.log(value);

 let fields = Object.values(value);
 console.log(fields)
});

С этим кодом я получил массив, но с внутренними объектами нетронутыми, как и ожидалось. Мне просто нужно найти, как конвертировать внутренние объекты. Может быть, с циклом внутри цикла (я считаю, что это плохая практика, нет?)

Ответы [ 3 ]

0 голосов
/ 25 марта 2019

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

let dados = {et1: {at:"Lorem ipsum dolor sit amet, consectetur",st:"Done",di:"01/19",df:"03/19",vl:"10000",sub1:{at:"Integer ligula purus, convallis convallis",st:"Done",di:"01/19",df:"03/19",vl:"8000" },sub2:{at:"Mauris felis tellus, ullamcorper eu",st:"Done",di:"01/19",df:"03/19",vl:"2000" }},et2: {at:"Nunc in urna ultricies sapien",st:"Post",di:"01/19",df:"03/19",vl:"40000"},et3: {at:"Phasellus varius rhoncus urna, nec",st:"Execution",di:"01/19",df:"03/19",vl:"4000",sub1:{at:"Phasellus varius rhoncus urna, nec",st:"Execution",di:"01/19",df:"03/19",vl:"2000" }}}
  
function printValues(obj){
    Object.entries(obj).forEach(([key, value]) => {
        if (typeof value == 'object' && value !== null)  printValues(value) // it's an object
        else  console.log(key, ":", value);
       });
}
  
printValues(dados)

У вас должна быть возможность изменить основную идею, чтобы получить плоский массив, если вы этого хотите.

0 голосов
/ 25 марта 2019

Вы на самом деле не говорите, в каком формате вам нужны данные, но я думаю, что это иллюстрирует, как получить значения из объекта на любом уровне. Я добавил переменные пути / уровня, чтобы проиллюстрировать, что происходит, но вы могли (например) использовать это, чтобы сгладить объект в один уровень (т.е. {et1.sub1.st: 'Done'} и т. Д.)


var values = [],
    path = [],
    level = 0,
    recurse = ob => {
        Object.entries(ob).forEach( ([k,v]) => {
            if(typeof v === 'object'){
                level++;
                path.push(k);
                recurse(v);
            } else {
                path.push(k);
                console.log(`level:${level}, key:${k}, path:${path.join('.')} value:${v}`);
                path.pop();
            }
        });
        level--;
        path.pop();
    };
recurse(dados);

// output (for ex): level:2, key:st, path:et1.sub1.st value:Done etc...

Кажется, стоит указать, что это предполагает, что ни одно из значений в вашем объекте не будет массивом. Если это возможный сценарий, вам нужно добавить проверку для него.

0 голосов
/ 25 марта 2019

Похоже, что вы хотите перебрать все свойства верхнего уровня в dados и получить значения всех свойств дочерних объектов (sub1, sub2).

Object.keys(dados).forEach(key => {
    let val = dados[key];
    if(typeof val === 'object'){
        Object.keys(val).forEach(k => console.log('%s: %s', k, val[k]);
    } else {
        // do something with non-object properties
    }
});

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

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