js对象扁平化处理

175 阅读1分钟

js对象扁平化处理

在工作中是否遇到这种情况,需要将很多层级对象平铺处理, 如图

原始数据

image.png

转换后

image.png

代码

const data = {
  app: {
    form: {
      inputPlaceholder: '请输入',
      selectPlaceholder: '请选择'
    },
    modal: {
      title: '弹框标题',
      content: '弹框内容',
      footer: '弹框底部'
    }
  },
  mes: {
    workCenter: '工作中心',
    batch: '批次'
  },
  qms: {
    defCode: '缺陷代码',
    qms: {
      qms: '1111'
    }
  },
  systemName: 'xxx后台管理系统'
};

/**
 * 对象扁平化
 * @param {Object} source
 * @param {String|Function} joinChar
 * @returns {Object}
 */
function objectFlat(source, joinChar = ".") {
  const Utils = {
    // 对象
    isObject: d => {
      return ({}).toString.call(d) === '[object Object]';
    },
    // 获取key的路径
    getKeyPath: (key, path, value) => {
      if (typeof joinChar === 'function') {
        return joinChar(key, path, value);
      }
      return path.length > 0 ? path.join(joinChar) + joinChar + key : key;
    }
  };

  // 执行方法
  function _walk(data, keyPath = []) {
    let result = {};
    for (let key in data) {
      const value = data[key];
      // 如果为对象,则需要继续递归往下找,同时需要传递当前路径给下级使用;
      if (Utils.isObject(value)) {
        const childrenData = _walk(value, [...keyPath, key]);
        result = Object.assign({}, result, childrenData);
      } else {
        const _keyPath = Utils.getKeyPath(key, keyPath, value);
        result[_keyPath] = value;
      }
    }
    return result;
  }
  const res = Utils.isObject(source) ? _walk(source, []) : {};
  return res
}

const resultData = objectFlat(data, "·"); // 第二个参数为分割字符,可以传函数自定义
console.log(resultData); // { a.b.c: '1111', c: 'xxx', a.c.d: '张三' }

最后

觉得可以的点个赞吧,3q~