[英]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] ]
];
您可以使用reduce
和forEach
方法执行此操作,以创建新数组,并基于第一行的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.