繁体   English   中英

如何对嵌套数组的元素进行分组?

[英]How to group elements of nested arrays?

有一个数组:

var ind = ["Apple", "Pear", "Banana"];

还有另一个数组:

var arr = [
  ["Apple", "Banana", "Pear", "Pear", "Apple", "Apple", "Banana"],
  [ 11,      12,       34,     54,     76,      23,      232    ],
  [ 33,      54,       22,     11,     23,      21,      33     ]
];

如何将子数组的所有值按顺序组合到数组ind中,使它们像这样:

var arr = [
  [ "Apple",      "Pear",   "Banana"  ],
  [  [11, 76, 23], [34, 54], [12, 232]],
  [  [33, 23, 21], [22, 11], [54, 33] ]
];

您可以使用reduceforEach方法执行此操作,以创建新数组,并基于第一行的indexOf当前元素和ind数组中同一元素的索引添加子数组。

 var ind = ["Apple", "Pear", "Banana"]; var arr = [ ["Apple", "Banana", "Pear", "Pear", "Apple", "Apple", "Banana"], [11, 12, 34, 54, 76, 23, 232], [33, 54, 22, 11, 23, 21, 33] ]; const first = arr[0]; const result = arr.slice(1).reduce((r, e, i) => { const a = r[i + 1] = []; e.forEach((el, j) => { const index = ind.indexOf(first[j]) if (!a[index]) a[index] = [el]; else a[index].push(el) }) return r; }, [ind]) console.log(result) 

您可以将数组用作获取正确索引的助手,并通过获取索引并将数组的值收集到索引来缩小数组。

 var columns = ["Apple", "Pear", "Banana"], data = [["Apple", "Banana", "Pear", "Pear", "Apple", "Apple", "Banana"], [11, 12, 34, 54, 76, 23, 232], [33, 54, 22, 11, 23, 21, 33]], indices = data[0].map(v => columns.indexOf(v)), result = [columns, ...data.slice(1).map(a => a.reduce((r, v, i) => { (r[indices[i]] = r[indices[i]] || []).push(v); return r; }, []))]; console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

您可以reduce以将值合并为一个值,具体取决于头的索引

 var ind = ["Apple", "Pear", "Banana"]; var [head, ...rest] = [ ["Apple", "Banana", "Pear", "Pear", "Apple", "Apple", "Banana"], [ 11, 12, 34, 54, 76, 23, 232 ], [ 33, 54, 22, 11, 23, 21, 33 ] ]; let out = [ind, ...rest.map(row => Object.values(row.reduce((acc, curr, i) => (acc[head[i]].push(curr), acc), ind.reduce((acc, curr) => (acc[curr] = [], acc), {}))))]; console.log(out) 

暂无
暂无

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

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