从数组数组到对象数组

时间:2018-03-11 08:19:51

标签: javascript arrays

我有一个数组(map)数组,如下所示:

var map = [
    ['red', 'blue', 'yellow'],
    ['car', 'pen', 'table', 'cup', 'pillow'],
    ['5', '6', '1', '2', '10'],
    ['15', '2', '2', '3', '20'],
    ['50', '60', '13', '1', '1']
];

我希望在这个对象阵列中转换这个数组:

var jsons = [
    {color: 'red', obj: 'car', value: '5'}, 
    {color: 'red', obj: 'pen', value: '6'}, 
    {color: 'red', obj: 'table', value: '1'}, 
    {color: 'red', obj: 'cup', value: '2'}, 
    {color: 'red', obj: 'pillow', value: '10'}, 
    {color: 'blue', obj: 'car', value: '15'}, 
    {color: 'blue', obj: 'pen', value: '2'}, 
    {color: 'blue', obj: 'table', value: '2'}, 
    {color: 'blue', obj: 'cup', value: '3'}, 
    {color: 'blue', obj: 'pillow', value: '20'},
    {color: 'yellow', obj: 'car', value: '50'}, 
    {color: 'yellow', obj: 'pen', value: '60'}, 
    {color: 'yellow', obj: 'table', value: '13'}, 
    {color: 'yellow', obj: 'cup', value: '1'}, 
    {color: 'yellow', obj: 'pillow', value: '1'}
];

我试过这段代码:

var thisJson = [];
var colors = map.shift(); 
var objs = map.shift();  

thisJson = map.reduce(function(result, v, i) {
    v.forEach(function(o, k) {
        result.push({color: colors[k], obj: objs[i], value: o});
    });
    return result;
}, jsons);

但它没有用,因为我得到了:

[
    {color: 'red', obj: 'car', value: '5'}, 
    {color: 'blue', obj: 'pen', value: '6'}, 
    {color: 'yellow', obj: 'table', value: '1'}, 
    ...
]

我该如何解决?

我可以将这些数据结构视为表格。 左边是我想要的桌子,右边是我得到的桌子。

enter image description here

很明显它们是不同的。

3 个答案:

答案 0 :(得分:2)

您可以使用循环执行此操作:



var map = [
    ['red', 'blue', 'yellow'],
    ['car', 'pen', 'table', 'cup', 'pillow'],
    ['5', '6', '1', '2', '10'],
    ['15', '2', '2', '3', '20'],
    ['50', '60', '13', '1', '1']
];
var result = [];
for(var i = 0; i < map[0].length; i++){
    var color = map[0][i];
    for(var j = 0; j < map[1].length; j++){
       result.push({color:color, obj: map[1][j], value: map[i+2][j]});
    }
}

console.log(result);
&#13;
&#13;
&#13;

这里重要的部分是如何设置值value: map[i+2][j]。使用colors数组中的索引设置该值。

此外,只有在values数组的元素数与objects数组的元素数相同且数组中的元素数量与数组一样多时,这才能正常工作。

答案 1 :(得分:1)

您可以使用shift删除数组的第一个元素并将其存储在变量中。

您可以使用mapreduce来形成所需的输出。

这是一个片段。

&#13;
&#13;
let map = [
  ['red', 'blue', 'yellow'],
  ['car', 'pen', 'table', 'cup', 'pillow'],
  ['5', '6', '1', '2', '10'],
  ['15', '2', '2', '3', '20'],
  ['50', '60', '13', '1', '1']
];

let color = map.shift();  //Remove the first element on the array and store on a variable
let object = map.shift(); //Remove the first element on the array and store on a variable

//Map the rest
let jsons = map.map((v, i) => {
  return v.map((o, k) => {return {color: color[i],obj: object[k],value: o};});
}).reduce((c, v) => c.concat(v), []);

console.log(jsons);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

 const result = [];

const keys = ["color", "obj", "value"];

 for(const [key, values] of map.entries())
    for(const [pos, value] of values.entries())
       (result[pos] || (result[pos] = {}))[keys[key]] = value;