【问题标题】:How can I Transform object in objects to array with es6 or lodash如何使用 es6 或 lodash 将对象中的对象转换为数组
【发布时间】:2018-10-07 14:49:16
【问题描述】:

我尝试做这个对象

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:...]

【问题讨论】:

  • 您的 to 对象令人困惑。您建议您需要一个数组,但这不是正确的语法。它像数组一样使用方括号,但像对象一样使用键/值对。一个建议可能是更明确/更正确地确定您想要的值是什么
  • StackOverflow 不是免费的编码服务。所以希望你try to solve your own problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :)
  • 我绝对知道这不是免费的编码服务。我的代码尝试什么都没有。所以我只写我所拥有的和我期望的。我知道规则,但这是我第一次也是最后一次遵守规则:)
  • @Ryoush 这与规则无关。这只是体面。
  • @evolutionxbox 反应过度?放轻松,冠军。

标签: javascript ecmascript-6 lodash


【解决方案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】:

使用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】:

您可以在两个级别上迭代您的键并使用 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)

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 非常高兴看到 lodash 版本。非常感谢
    猜你喜欢
    • 2018-01-22
    • 1970-01-01
    • 2015-07-25
    • 2016-08-06
    • 2019-04-18
    • 2015-10-12
    • 2019-01-26
    • 1970-01-01
    相关资源
    最近更新 更多