展平对象,获取控制台记录三次

Flatten the object gets the console logged thrice

提问人:Arif Ahmed 提问时间:11/1/2023 最后编辑:VLAZArif Ahmed 更新时间:11/1/2023 访问量:43

问:

当我使用下面的代码来展平对象时,我记录了三次控制台。该对象是返回或控制台一个对象,即newObj

有人能告诉我我做错了什么吗?

数据输入

const data = {
    id: 09,
    email: '[email protected]',
    contactInfo: {
        name: 'Test1',
        address: {
            city: 'Berlin',
            country: 'Germany'
        }
    }
}

在这里,我通过递归调用来展平对象。

const newObj = {}

const getFlattenObj = (data) => {
    Object.keys(data).forEach(key => {
        if (typeof data[key] === 'object') {
            getFlattenObj(data[key]);
        } else {
            newObj[key] = data[key]
        }
    })

    console.log(newObj);
}

getFlattenObj(data);

JavaScript 对象

评论

1赞 Layhout 11/1/2023
控制台被记录三次,因为运行了三次。console.log(newObj);
0赞 Arif Ahmed 11/1/2023
如果我用控制台退出对象,它将返回空。我该如何解决?
0赞 Layhout 11/1/2023
data是三层深。
0赞 Layhout 11/1/2023
如果你写在 之后,你会看到你的console.log(newObj);getFlattenObj(data);newObj;
0赞 Arif Ahmed 11/1/2023
如果我不添加控制台日志,我希望对象在函数调用中填充。

答:

3赞 Gabriele Petrioli 11/1/2023 #1

您正在记录 这是一个递归函数,因为当键的值是对象时,它会调用自己。getFlattenObj

所以最初的调用是一次,然后代码会遇到密钥并再次调用,所以另一个日志,然后第二次调用将遇到密钥并再次调用。所以 3 次调用是 3 个日志。contactInfogetFlattenObjaddressgetFlattenObjgetFlattenObj


您可以添加的另一个改进是不要对 使用全局变量,而是在方法中传递或创建它,这样您就可以多次重用该函数,而无需手动清除对象。newObj

const data = {
  id: 09,
  email: '[email protected]',
  contactInfo: {
    name: 'Test1',
    address: {
      city: 'Berlin',
      country: 'Germany'
    }
  }
}

const getFlattenObj = (data, targetObject = {}) => {
  Object.keys(data).forEach(key => {
    if (typeof data[key] === 'object') {
      getFlattenObj(data[key], targetObject);
    } else {
      targetObject[key] = data[key]
    }
  })
  return targetObject;
}

const newObj = getFlattenObj(data);
console.log(newObj);