代码之家  ›  专栏  ›  技术社区  ›  Ryoush

如何使用es6或lodash将对象中的对象转换为数组

  •  2
  • Ryoush  · 技术社区  · 7 年前

    我试着做这件事

    obj={ 
        a:{ 1:"x", 2:"c"}, 
        b:{ 1:"v", 2:"b" }, 
        c:{ 4:"n", 2:"k" } 
    }
    

     obj=[
        0:{group:"a" ,1:"x"},
        1:{group:"a", 2:"c"},
        2:{group:"b",1:"v"},
        3:...]
    
    4 回复  |  直到 7 年前
        1
  •  1
  •   Eddie    7 年前

    你可以用 Object.entries() 将对象转换为数组。使用 .reduce() , .concat() map() 构造新数组

    let obj = {
      a: {
        1: "x",
        2: "c"
      },
      b: {
        1: "v",
        2: "b"
      },
      c: {
        4: "n",
        2: "k"
      }
    }
    
    
    let result = Object.entries(obj)
                       .reduce((c, [k, v]) => c.concat(Object.entries(v).map(o => ({group: k,[o[0]]: o[1]}))), [])
    
    console.log(result);
        2
  •  1
  •   brk    7 年前

    Object.keys 从对象获取所有键。然后使用数组 reduce 功能和;在回调函数中,在对象上循环并创建一个新对象。

    let obj = {
      a: {
        1: "x",
        2: "c"
      },
      b: {
        1: "v",
        2: "b"
      },
      c: {
        4: "n",
        2: "k"
      }
    }
    let m = Object.keys(obj);
    
    let z = m.reduce(function(acc, curr) {
      if (typeof(obj[curr]) === 'object') {
        for (let keys in obj[curr]) {
          let __ob = {};
          __ob.group = curr;
          __ob[keys] = obj[curr][keys]
          acc.push(__ob)
        }
    
      }
      return acc;
    
    }, [])
    console.log(z)
        3
  •  1
  •   Mike    7 年前

    let obj={ a:{ 1:"x", 2:"c"}, b:{ 1:"v", 2:"b" }, c:{ 4:"n", 2:"k" } }
    
    let result = []
    for (let k1 in obj){
      for (let k2 in obj[k1] ){
        result.push({group:k1,[k2]:obj[k1][k2]})
      }
    }
    
    console.log(result)
        4
  •  1
  •   Ori Drori    7 年前

    使用lodash,用 _.flatMap() . 在flatMap的回调中,第一个参数是( { 1: 'x', 2: 'c' } 例如),第二个参数是键( a 例如)。将第二个参数指定给 group . 使用 _.toPairs() 获取成对数组( [key, value] ). 将对转换为对象 Array.map() ,并包括 :

    const obj = {"a":{"1":"x","2":"c"},"b":{"1":"v","2":"b"},"c":{"2":"k","4":"n"}};
    
    const result = _.flatMap(obj, 
      (o, group) => 
        _.toPairs(o).map(([k, v]) => ({
          group,
          [v]: k
        })));
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>