【问题标题】:How to convert array into array of objects using .reduce()如何使用 .reduce() 将数组转换为对象数组
【发布时间】:2017-12-24 05:11:57
【问题描述】:

如何使用 .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
}

【问题讨论】:

  • 你意识到你正在将函数推送到新数组中
  • 尝试array.map而不是`array.push(`
  • 奇怪的是你认为 array.push 像 array.reduce 一样工作:p

标签: javascript arrays object functional-programming


【解决方案1】:

您可以尝试array.maparray.reduce 的组合。

Array.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)

【讨论】:

  • 这很棒。我以前有类似的东西,但我使用 .reduce() 代替 .map()。
【解决方案2】:

对于带有spread syntax ... 的属性,您可以将Array#mapObject.assign 结合使用。

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; }

【讨论】:

  • Object.assign(...o.map(array.reduce 有什么优势吗?
  • 我知道有一个更好的方法:p /跨度>
【解决方案3】:

这是使用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);

使用两个 reduce 的解决方案。

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);

【讨论】:

  • 你也可以改成reduce而不是forEach const obj = currArr.reduce((a,x) => { a[x[0]] = x[1]; return a },{});
  • 感谢 @GerardBanasig 使用两个 reduce 更新了解决方案。 :)
【解决方案4】:

您实际上已经很接近了,只是您似乎认为 array.push 像 array.reduce 一样工作 - 它没有

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

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

我只需要将这个“扩展”添加到目前为止的最佳答案中

const transformData=_=>_.map(_=>Object.assign(..._.map(([$,_])=>({[$]:_}))));

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

【讨论】:

    【解决方案5】:

    试试这个:

    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)
    

    【讨论】:

      【解决方案6】:

      这是一个使用 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)

      【讨论】:

        猜你喜欢
        • 2018-12-26
        • 2021-12-27
        • 2020-08-24
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2019-04-08
        • 2019-01-04
        • 1970-01-01
        相关资源
        最近更新 更多