如何将对象中的对象转换为带有es6或lodash的数组

时间:2018-10-07 14:49:17

标签: javascript ecmascript-6 lodash

我尝试做这个对象

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 个答案:

答案 0 :(得分:1)

使用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)

答案 1 :(得分:1)

您可以使用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)

您可以在两个级别上迭代密钥,并使用ES6 / ES2015提供的计算密钥语法:

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)

答案 3 :(得分:1)

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

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>