繁体   English   中英

如何使用 JavaScript 中的 reduce 将 arrays 的二维数组转换为对象数组?

[英]How to convert 2d array of arrays to array of objects using reduce in JavaScript?

所以我有一个 arrays 数组,它们是表中的行,我想将其转换为对象数组。 我有一个列数组,所以我知道键是什么,当然长度显然是相同的。 我知道传统上如何使用 for 循环来做到这一点,但想知道如何使用 reduce 或可能的另一种更简洁的方式来做到这一点。

 let columnArr = ["Name", "Group", "Tier"]; let twoDArryOfArrs = [ ["Fred", "1FAKnock", "1a"], ["Brenda", "2GPvoge", "1a"], ["Francis", "67Gruz", "1a"], ["Arnold", "1FAKnock", "2b"], ["Candice", "67Gruz", "1a"], ["Larry", "1GTAFQT", "4a"], ["Tony", "2GPvoge", "2c"], ["Ronnie", "2GPvoge", "3a"] ]; function convert2dArryToArrOfObjects(arr2d, colArr) { let obj = {}, resultArr = []; for (let i = 0; i < arr2d.length; i++) { let innerArr = arr2d[i]; for (let j = 0; j < innerArr.length; j++) { obj[colArr[j]] = innerArr[j]; } resultArr.push(obj); obj = {}; } return resultArr; } const output = convert2dArryToArrOfObjects(twoDArryOfArrs, columnArr); console.log(output);

一种方法是将归约嵌套在归约内,其中:

  • 外部减少涉及获得所需的结果resultArr
  • 内部归约侧重于组成将列与行值匹配的“每行”项 object

如前所述,假设列数与输入 2D 数组中的行项数相匹配 - 考虑到这一点,以下解决方案应该可以满足您的要求:

 let columnArr = ["Name", "Group", "Tier"]; let twoDArryOfArrs = [ ["Fred", "1FAKnock", "1a"], ["Brenda", "2GPvoge", "1a"], ["Francis", "67Gruz", "1a"], ["Arnold", "1FAKnock", "2b"], ["Candice", "67Gruz", "1a"], ["Larry", "1GTAFQT", "4a"], ["Tony", "2GPvoge", "2c"], ["Ronnie", "2GPvoge", "3a"] ]; // Cause the resulting array to be logged to console (for snippet) console.log(twoDArryOfArrs.reduce((resultArr, row, idx) => { // Extract item object for result array from current row via // a nested reduction const item = columnArr.reduce((obj, col, jdx) => { // Compose the object by merging row value (at ordered jdx) // to "col" key of current column, into the resulting object // item return {...obj, [col]: row[jdx] } }, {}) //Append the composed item object to the current resultArr that // has been reduced return [...resultArr, item] }, []))

希望有帮助!

你可以用 map 这样做

 let columnArr = ["Name", "Group", "Tier"]; let twoDArryOfArrs = [ ["Fred", "1FAKnock", "1a"], ["Brenda", "2GPvoge", "1a"], ["Francis", "67Gruz", "1a"], ["Arnold", "1FAKnock", "2b"], ["Candice", "67Gruz", "1a"], ["Larry", "1GTAFQT", "4a"], ["Tony", "2GPvoge", "2c"], ["Ronnie", "2GPvoge", "3a"] ]; let arrayOfObj = twoDArryOfArrs.map( el => ({Name: el[0], Group: el[1], Tier:el[2]})) console.log(arrayOfObj)

您不需要reduce ,只需一个简单的map

conv2 = (a2, cols) => a2.map(el => ({
  [cols[0]]: el[0],
  [cols[1]]: el[1],
  [cols[2]]: el[2]
}));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM