在香草JS中的对象内部循环对象

时间:2019-03-25 15:09:40

标签: javascript arrays loops object

我附上了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 :(得分:0)

听起来像您想遍历dados中每个顶级属性并获取子对象(sub1sub2)的所有属性的值。

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
    }
});

为了清楚起见,在循环中使用循环并不一定是一个坏习惯。实际上,这就是在这种情况下医生的命令。

答案 1 :(得分:0)

对于任意深度的对象,可以创建递归函数。它打印常规值并将对象传递回该函数。这将按深度优先顺序打印所有值。

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)

如果您要的是,您应该能够修改基本概念以创建一个扁平数组。

答案 2 :(得分:0)

您并没有真正说出所需的数据格式,但是我认为这说明了如何从任何级别的对象获取值。我添加了path / level变量以帮助说明发生了什么,但是您可以(例如)使用它来将对象展平为单个级别(即{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...

似乎值得指出的是,这假定对象中的任何值都不是数组。如果可能的话,您需要为其添加检查。

相关问题