• 阿里巴巴二面凉经 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
    }
  • 相关阅读:
    CodeSmith 破解
    overflow 及其属性
    Override any CSS style (even inline styles) no matter where it is defined
    CSS驱动的下拉菜单
    对zindex的重新学习
    Eeic Meyer on CSS 之 文字排列成曲线
    Eeic Meyer on CSS 之 背景半透明效果
    background背景窍门
    CSS实现网页图片预加载
    meta 标签举例
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/12692355.html
Copyright © 2020-2023  润新知