javascript - Object 提取值
PHPz
PHPz 2017-04-10 17:52:25
0
3
254
const from = {
    a: {
        b: ['01', '02']
    },
    c: {
        d: {
            e: ['03', '04']
        },
        f: ['05', '06']
    }
}
=>
to1 = {
    a: {
        b: '01'
    },
    c: {
        d: {
            e: '03'
        },
        f: '05'
    }
}
to2 = {
    a: {
        b: '02'
    },
    c: {
        d: {
            e: '04'
        },
        f: '06'
    }
}

这边拿到的是一个嵌套层级不规则的对象,需要的值是一个数组,数组的长度是固定的,现在想要做的是通过数组的长度来拆分这个对象,把这个对象拆分成和数组长度一样个数的对象,嵌套格式和key不变,对应提取数组的第n个值,有没有什么好的办法?

PHPz
PHPz

学习是最好的投资!

全部回复(3)
伊谢尔伦

一次遍历的实现,感觉还有更优雅的实现

const from = {
  a: {
    b: ['01', '02']
  },
  c: {
    d: {
      e: ['03', '04']
    },
    f: ['05', '06']
  }
}

console.log(splitByIndex(from));

function splitByIndex(obj) {
  let res = [];
  run([], obj);

  return res;

  function run(pre, obj) {
    let item;
    for (let i in obj) {
      item = obj[i];
      let currentPre = Array.prototype.concat(pre, i);
      if (Array.isArray(item)) return addObj(currentPre, item);
      run(currentPre, item);
    }
  }

  function addObj(pre, item) {
    item.forEach((v, i) => {
      if (!res[i]) res[i] = {};
      let tmp = res[i];
      let max = pre.length - 1;
      let prefix;
      for (let j = 0; j < max; j++) {
        prefix = pre[j];
        if (!tmp[prefix]) tmp[prefix] = {};
        tmp = tmp[prefix];
      }
      tmp[pre[max]] = [v];
    });
  }
}
伊谢尔伦

递归。用对象表示。

迷茫

一个简单的递归方法,for...in性能好。

const to1 = tran (from, 0)
const to2 = tran (from, 1)

function tran (obj, propKey) {
  let newObj = {}
  for (let key in obj) {
    const value = obj[key]
    if (Array.isArray(value)) {
      newObj[key] = value[propKey]
    } else {
      newObj[key] = cutLang(value, propKey)
    }
  }
  return newObj
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板