阿里巴巴二面凉经 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,丢弃
};

题解:
思路1:转为对象后递归
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;
}

 思路2:记录前key递归

function flatten(input) {
  let result = {}

  function flat(prekey, ipt) {
    if (ipt) {
      let temp = {}
      if (Object.prototype.toString.call(ipt) === '[object Object]') {
        for (let key in ipt) {
          temp = Object.assign(temp, flat(prekey + '.' + key, ipt[key]))
        }
      } else if (Array.isArray(ipt)) {
        for (let key in ipt) {
          temp = Object.assign(temp, flat(prekey + '[' + key + ']', ipt[key]))
        }
      } else {
        temp[prekey] = ipt
      }
      return temp
    }
  }

  for (let key in input) {
    result = Object.assign(result, flat(key, input[key]))
  }
  return result
}

 

posted @ 2020-04-13 16:50  蓝小胖纸  阅读(393)  评论(0编辑  收藏  举报