对象flatten方法

305 阅读1分钟

题目描述

实现一个方法,将对象按如下要求扁平化,对象用.连接,数组通过[key]连接,最后结果如下:

const obj = {
  a: {
    b: 1,
    c: 2,
    d: { e: 5 }
  },
  b: [1, 3, { a: 2, b: 3 }],
  c: 3
};

console.log(flatten(obj));
// {
//  'a.b': 1,
//  'a.c': 2,
//  'a.d.e': 5,
//  'b[0]': 1,
//  'b[1]': 3,
//  'b[2].a': 2,
//  'b[2].b': 3
//   c: 3
// }

代码实现

function flatten (obj) {
  if (!isObject(obj)) {
    return;
  }
  const result = {};
  const dfs = (current, prefix) => {
    // 对象
    if (isObject(current)) {
      // 数组类型
      if (Array.isArray(current)) {
        current.forEach((item, index) => {
          // 数组前缀
          dfs(item, `${prefix}[${index}]`);
        });
      } else {
        // 普通对象
        for (const key in current) {
          // 普通对象前缀
          dfs(current[key], `${prefix}${prefix ? '.' : ''}${key}`);
        }
      }
    } else {
      result[prefix] = current;
    }
  };
  dfs(obj, '');
  return result;
}

function isObject (val) {
  return typeof val === 'object' && val !== null;
}