如何使用.reduce()将数组转换为对象数组

时间:2017-07-19 05:51:27

标签: javascript arrays object functional-programming

如何使用.reduce()将多维数组转换为对象数组?

启动数组

[
    [
        ['juice', 'apple'], ['maker', 'motts'], ['price', 12]
    ],
    [
        ['juice', 'orange'], ['maker', 'sunkist'], ['price', 11]
    ]
]

结束数组

[
    {juice: 'apple', maker: 'motts', price: 12},
    {juice: 'orange', maker: 'sunkist', price: 11}
]

这就是我现在所拥有的。这真的只是我在黑暗中拍摄。

var transformData = (array) => {
    var newArray = array.push(function (all, item, index) {
        var newItem = item.reduce(function (all, item, index) {
            all[item[0]] = item[1]
            return all
        }, {})
        return all
    }, [])
    newArray.push(newItem)
    return newArray
}

6 个答案:

答案 0 :(得分:1)

您可以尝试array.reduceArray.push的组合。

array.map适合于向数组添加元素,但如果要将数组的所有元素转换为特定规范,最好使用var data = [ [ ['juice', 'apple'], ['maker', 'motts'], ['price', 12] ], [ ['juice', 'orange'], ['maker', 'sunkist'], ['price', 11] ] ] var result = data.map(function(list){ return list.reduce(function(o, kv){ o[kv[0]] = kv[1]; return o; }, {}); }) console.log(result)

13

答案 1 :(得分:1)

您可以将Array#mapObject.assign结合使用spread syntax ...的属性。

var data = [[['juice', 'apple'], ['maker', 'motts'], ['price', 12]], [['juice', 'orange'], ['maker', 'sunkist'], ['price', 11]]], 
    result = data.map(o => Object.assign(...o.map(p => ({ [p[0]]: p[1] }))));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:1)

以下是使用reduceforeach的解决方案。

var items = [
    [
        ['juice', 'apple'], ['maker', 'motts'], ['price', 12]
    ],
    [
        ['juice', 'orange'], ['maker', 'sunkist'], ['price', 11]
    ]
];


var transformData = items.reduce((newArr, currArr) => {
  var obj = {};
  currArr.forEach((x) => {
    obj[x[0]] = x[1];
  });
  return newArr.concat(obj);
},[]);
console.log(transformData);

使用两个减少的解决方案。

var items = [
    [
        ['juice', 'apple'], ['maker', 'motts'], ['price', 12]
    ],
    [
        ['juice', 'orange'], ['maker', 'sunkist'], ['price', 11]
    ]
];


var transformData = items.reduce((newArr, currArr) => {
  return newArr.concat(currArr.reduce((o, arr) =>{
      o[arr[0]] = arr[1];
      return o;
   }, {}));  
},[]);
console.log(transformData);

答案 3 :(得分:0)

你真的很接近,除了你似乎认为array.push像array.reduce一样工作 - 它不是

private

由于你正在使用一些ES2015 +功能,我使用了更多...内部数组的解构[key,value]

我必须将此“扩展名”添加到目前为止的最佳答案

var transformData = array => 
    array.map(subarray => 
        subarray.reduce((result, [key, value]) => {
            result[key] = value;
            return result;
        }, {})
    );

在几个月内尝试阅读并知道它在做什么:p

答案 4 :(得分:0)

试试这个:

var parray=[
[
    ['juice', 'apple'], ['maker', 'motts'], ['price', 12]
],
[
    ['juice', 'orange'], ['maker', 'sunkist'], ['price', 11]
]
];

var newArray=[]
parray.forEach(function(data){
var cak  =  data.reduce(function(a, b) {
a[b[0]]=b[1]
  return a;
}, {})
newArray.push(cak)
})
console.log(newArray)

答案 5 :(得分:0)

这是使用mapreduce以及对象扩展语法的简洁表达。

const data = [
  [
    ['juice', 'apple'], ['maker', 'motts'], ['price', 12]
  ],
  [
    ['juice', 'orange'], ['maker', 'sunkist'], ['price', 11]
  ]
]

const data2 =
  data.map (pairs =>
    pairs.reduce ((o, [k,v]) =>
      ({ ...o, [k]: v }), {}))

console.log (data2)