首页 > 解决方案 > 规范化 Javascript 对象

问题描述

我有一个 json 对象,其中包含对象,例如user: {"name": "tim"}并且想要一种将其转入的方法"user.name": 'tim'

我试过:Javascript Recursion normalize JSON data

哪个没有返回我想要的结果,也尝试了一些包,没有运气

标签: javascript

解决方案


您可以使用递归方法通过连接它们的键来展平嵌套对象,如下所示:

const flattenObject = (obj) => {
  const flatObject = {};

  Object.keys(obj).forEach((key) => {
    const value = obj[key];

    if (typeof value === 'object') {
      const flatNestedObject = flattenObject(value);

      Object.keys(flatNestedObject).forEach((nestedKey) => {
        flatObject[`${key}.${nestedKey}`] = flatNestedObject[nestedKey];
      });
    } else {
      flatObject[key] = value;
    }
  });

  return flatObject;
};

const obj = {
  user: { name: 'tim' },
};

console.log(flattenObject(obj));

此解决方案适用于任何数量的级别。

如果您的环境不支持Object.keys,您可以for..in改用:

const flattenObject = (obj) => {
  const flatObject = {};

  for (const key in obj) {
    if (!obj.hasOwnProperty(key)) continue;
    const value = obj[key];

    if (typeof value === 'object') {
      const flatNestedObject = flattenObject(value);

      for (const nestedKey in flatNestedObject) {
        if (!flatNestedObject.hasOwnProperty(nestedKey)) continue;
        flatObject[`${key}.${nestedKey}`] = flatNestedObject[nestedKey];
      }
    } else {
      flatObject[key] = value;
    }
  }

  return flatObject;
};

const obj = {
  user: { name: 'tim' },
};

console.log(flattenObject(obj));


推荐阅读