我附上了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)
});
有了这个代码,我得到了一个数组,但是内部对象没有被触碰,正如预期的那样。我只需要找到如何转换内部对象。也许在一个循环中有一个循环(我相信这是一个坏习惯,不是吗?)
答案 0 :(得分:0)
听起来像您想遍历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
}
});
为了清楚起见,在循环中使用循环并不一定是一个坏习惯。实际上,这就是在这种情况下医生的命令。
答案 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...
似乎值得指出的是,这假定对象中的任何值都不是数组。如果可能的话,您需要为其添加检查。