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({ /*...*/ }));

09-10 10:52
查看更多