阿里巴巴二面凉经 flatten扁平化对象与数组

2020-04-13
阿里巴巴二面凉经 flatten扁平化对象与数组

在线笔试的时候写错了一点点 太可惜了哎 还是基础不够扎实。。。

const input = {
  a: 1,
  b: [ 1, 2, { c: true }, [ 3 ] ],
  d: { e: 2, f: 3 },
  g: null,
}

function flatten(input) {
  // 需要实现的代码
}

flatten(input);

// 返回
{
  "a": 1,
  "b[0]": 1,
  "b[1]": 2,
  "b[2].c": true,
  "b[3][0]": 3,
  "d.e": 2,
  "d.f": 3,
  // "g": null, 值为null或者undefined,丢弃
};

题解:
递归
function flatten(obj) {
  let result = {};
  if (Array.isArray(obj)) { // 初始的input是array 转为object
    let tmp = {};
    obj.forEach((item, index) => {
      let attr = '[' + index + ']';
      tmp[attr] = obj[index];
    });
    result = flatten(tmp);
  } else {
    Object.keys(obj).forEach(key => { // 通过key遍历对象
      if (typeof obj[key] === 'object') {
        // console.log(Object.prototype.toString.call(obj[key])) 也可以用这个判断准确的类型
        // if (Array.isArray(obj[key])) { 
        if (Object.prototype.toString.call(obj[key]) === '[object Array]') { // 如果某项值为array
          let tmp = {};
          obj[key].forEach((item, index) => {
            let attr = key + '[' + index + ']';
            tmp[attr] = obj[key][index];
          });
          result = Object.assign({}, result, flatten(tmp)); // 转为对象后递归再与原来的result合并
        }
        else if (Object.prototype.toString.call(obj[key]) === '[object Object]') { // 如果是对象
          let tmp = {};
          Object.keys(obj[key]).forEach(k => {
            let attr = key + '.' + k;
            tmp[attr] = obj[key][k];
          });
          result = Object.assign({}, result, flatten(tmp)); // 递归后合并
        }
      } else {
        if (obj[key]) { // 避免出现undefined
          result[key] = obj[key];
        }
      }
    });
  }
  return result;
}

猜你喜欢

转载自www.cnblogs.com/lanpang9661/p/12692355.html