项目分组在索引
问题描述:
我有一个多维数组这样的:项目分组在索引
var arr = [ [x,x,1] , [x,x,2] , [x,x,2] , [x,x,3] , [x,x,3] , [x,x,3] ];
,我想(根据匹配arr[i][2]
值分组每个子阵列),以使它像这样:
var arr = [ [[x,x,1]] , [[x,x,2],[x,x,2]] , [[x,x,3],[x,x,3],[x,x,3]] ];
我的尝试越来越啰嗦,我很惭愧地在这里发帖。任何有效的建议非常感谢!
答
Array#forEach
溶液。
var arr = [["x","x", 1],["x","x", 2],["x","x", 2],["x","x", 3],["x","x", 3],["x","x", 3]], obj = {};
arr.forEach(v => (obj[v[2]] || (obj[v[2]] = [])).push(v));
var res = Object.keys(obj).map(v => obj[v]);
console.log(JSON.stringify(res));
答
您可以先使用一个对象对数组进行分组,然后使用map()
和Object.keys()
作为结果返回数组。
var arr = [["x","x", 1],["x","x", 2],["x","x", 2],["x","x", 3],["x","x", 3],["x","x", 3]];
var obj = {}
arr.forEach(function(e) {
if(!obj[e[2]]) obj[e[2]] = []
obj[e[2]].push(e)
});
var result = Object.keys(obj).map(e => obj[e]);
console.log(JSON.stringify(result))
答
var x = 'x';
var arr= [ [x,x,1] , [x,x,2] , [x,x,2] , [x,x,3] , [x,x,3] , [x,x,3] ];
var working = arr.reduce(function(acc, current) {
(acc[current[2]] || (acc[current[2]] = [])).push(current);
return acc;
}, {});
var result = Object.keys(working).map(function(k) { return working[k] });
console.log(JSON.stringify(result)); // stringified just to avoid scrolling
答
你可以使用一个Map
并产生Array#reduce
在一个循环的新阵列。
var array = [['x', 'x', 1], ['x', 'x', 2], ['x', 'x', 2], ['x', 'x', 3], ['x', 'x', 3], ['x', 'x', 3]],
grouped = array.reduce((map =>
(r, a) =>
(!map.has(a[2]) && map.set(a[2], r[r.push([]) - 1]), map.get(a[2]).push(a), r)
)(new Map), []);
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }