let person={
id: 01,
name:'john',
age:'21',
address:{
city:{
city_name:'Mumbai',
pin:54321
},
state: 'Maharashtra',
country:'india',
street:'Main street'
}
}
function flat(myobj){
for (item in myobj)
{
if(typeof item === 'Object')
{
flat(item);
}
console.log(item+'-'+myobj[item]+'\n');
}
}
flat(person);
我尝试过的上面的代码
我正在尝试将此对象转换为用连字符分隔的扁平字符串。但是我在访问嵌套对象时卡住了,我要出去了,但是,
1号
约翰
21岁
地址-[对象对象]
我的预期输出
1号
约翰
21岁
address-city-city_name-mumbai-pin54321-state-maharashtra-country-india...。
任何建议,我错了,需要任何其他优化。
最佳答案
item
是对象键,因此typeof item
始终为"string"
。您可能需要改为检查typeof myobj[item] === "object"
...此外,您还需要一种在进行递归调用时跟踪嵌套键的方法,可以通过在调用时传递先前的键来实现:
function flat(obj, prev = ""){
for (let key in obj) {
if(typeof obj[key] === "object") {
flat(obj[key], prev + "-" + key);
} else {
console.log((prev ? prev + "-" : "") + key + ": " + obj[key]);
}
}
}
这是我的写法:
function keyValuePairs(obj, prev = []) {
for(const [key, value] of Object.entries(obj)) {
if(typeof value === "object") {
yield* keyValuePairs(value, [...prev, key]);
} else yield [[...prev, key].join("-"), value];
}
}
const result = Object.fromEntries(keyValuePairs({ /*...*/ }));