将数组转换为对象

时间:2017-06-08 01:08:16

标签: javascript

如何使用javascript处理将数组数组转换为对象数组的任务?例如。

[
     [
          [a,b],[c,d],[e,f]
     ],
     [
          [g,h],[i,j],[k,l]
     ]
]

--->

[
     {a:b, c:d, e:f}, {g:h, i:j, k:l}
]

2 个答案:

答案 0 :(得分:2)

使用mapreduce

进行功能数据转换

您可以使用mapreduce来获得所需的数据形状

const data = [
  [ ['a', 1], ['b', 2], ['c', 3] ],
  [ ['d', 4], ['e', 5], ['f', 6] ]
]

const data2 = data.map(pairs =>
  pairs.reduce((obj, [k,v]) =>
    Object.assign(obj, { [k]: v }), {}))
    
console.log(data2)
// [ { a: 1, b: 2, c: 3 }, { d: 4, e: 5, f: 6 } ]

通用功能

上述转换在认知上是密集的,可以分解为两个有用的函数 - 这两个函数mapReducerpair2obj足够通用,我们可以轻松地在程序的其他部分重用它们

const mapReducer = (f, g) =>
  (acc, x) => f (acc, g (x))

const pair2obj = ([x, y]) =>
  ({ [x]: y })

const data = [
  [ ['a', 1], ['b', 2], ['c', 3] ],
  [ ['d', 4], ['e', 5], ['f', 6] ]
]

const data2 = data.map (pairs =>
  pairs.reduce(mapReducer(Object.assign, pair2obj), {}))

console.log(data2)
// [ { a: 1, b: 2, c: 3 }, { d: 4, e: 5, f: 6 } ]

原生Map

如果您可以在程序中使用Map个对象,这可能会更好,因为您的数据已经采用Map构造函数接受的格式

const data = [
  [
    ['a',1],['b',2],['c',3]
  ],
  [
    ['d',4],['e',5],['f',6]
  ]
]

const data2 = data.map(pairs => new Map(pairs))

console.log(data2[0].get('a')) // 1
console.log(data2[0].get('b')) // 2
console.log(data2[0].get('c')) // 3
console.log(data2[1].get('d')) // 4
console.log(data2[1].get('e')) // 5
console.log(data2[1].get('f')) // 6

答案 1 :(得分:0)

我很好奇,所以我觉得我有一个裂缝。

我假设key值始终是允许的对象键值。

var data = [
  [
    ['a','b'],['c','d'],['e','f']
  ],
  [
    ['g','h'],['i','j'],['k','l']
  ]
];

// ES5
data = data.map(function (d) {
  return d.reduce(function (o, v) {
    o[v[0]] = v[1];    
    return o;
  }, {});
});

// ES6
data = data.map((d) => d.reduce((o, v) => {
    o[v[0]] = v[1];    
    return o;
}, {}));

console.log(data);