📜  将 JavaScript 对象扁平化为单深度对象(1)

📅  最后修改于: 2023-12-03 15:25:13.992000             🧑  作者: Mango

将 JavaScript 对象扁平化为单深度对象

有时候,我们需要将一个嵌套的 JavaScript 对象转换为单深度对象,以便于序列化、查询等操作。这里介绍几种方法可以实现对象扁平化。

方法一:使用 Object.assign()
function flattenObject(obj) {
  return Object.assign({}, ...function _flatten(childObj, prefix = '') {
    return [].concat(
      ...Object.keys(childObj).map(
        key => typeof childObj[key] === 'object' ? _flatten(childObj[key], `${prefix}${key}.`) : {[`${prefix}${key}`]: childObj[key]}
      )
    );
  }(obj));
}

这个方法使用 Object.assign() 函数将扁平化后的对象合并到一个新的对象中。我们首先创建一个 _flatten() 函数来递归地迭代对象,处理每个元素,并将它们转换为键-值对的数组。最后使用 Object.assign() 函数将结果数组中的多个元素合并到一个对象中。

方法二:使用递归函数
function flattenObject(obj, prefix = '') {
  return Object.keys(obj).reduce((acc, k) => {
    const pre = prefix.length ? prefix + '.' : '';
    if (typeof obj[k] === 'object') {
      Object.assign(acc, flattenObject(obj[k], pre + k));
    } else {
      acc[pre + k] = obj[k];
    }
    return acc;
  }, {});
}

这个方法使用递归函数,首先将对象的所有键名存入一个数组,然后使用 reduce() 方法将它们合并为一个单深度对象。

方法三:使用循环
function flattenObject(obj) {
  const result = {};

  function recurse(cur, prop) {
    if (Object(cur) !== cur) {
      result[prop] = cur;
    } else if (Array.isArray(cur)) {
      for (let i = 0, l = cur.length; i < l; i++)
        recurse(cur[i], `${prop}[${i}]`);
      if (l === 0)
        result[prop] = [];
    } else {
      let isEmpty = true;
      for (let p in cur) {
        isEmpty = false;
        recurse(cur[p], prop ? `${prop}.${p}` : p);
      }
      if (isEmpty && prop)
        result[prop] = {};
    }
  }

  recurse(obj, '');
  return result;
}

这个方法使用循环来遍历对象及其属性,将它们转换为单深度对象。递归函数 recurse() 首先检查当前对象是否为基础类型,如果是,则将其保存到结果对象中;否则,它将检查当前对象是否为数组,如果是,它将递归地处理数组元素,否则将递归地处理对象的属性。

结论

以上是三种常见的方法将嵌套的 JavaScript 对象扁平化为单深度对象。每个方法都有自己的优点和缺点,选择哪种方法取决于项目的需要和开发者的喜好。