输入:['A1','B1','C1','E1','A2','C2','D2','H2','A3','E3']
//要求输出二维数组 对数组进行分组,
输出:[
['A1','B1','C1','E1'],
['A2','C2','D2','H2'],
['A3','E3']
]
输入:['A1','B1','C1','E1','A2','C2','D2','H2','A3','E3']
//要求输出二维数组 对数组进行分组,
输出:[
['A1','B1','C1','E1'],
['A2','C2','D2','H2'],
['A3','E3']
]
const temp = ["A1", "B1", "C1", "E1", "A2", "C2", "D2", "H2", "A3", "E3"];
const grouping = (arr) => {
const getGroupId = (str) => {
return str[str.length - 1];
};
const ans = [];
for (let i = 0; i < arr.length; ++i) {
const groupId = getGroupId(arr[i]);
if (!ans[groupId]) ans[groupId] = [];
ans[groupId].push(arr[i]);
}
return ans.filter(Boolean);
};
console.log(grouping(temp));
Object.values(["A1", "B1", "C1", "E1", "A2", "C2", "D2", "H2", "A3", "E3"].reduce((res,str) => {
var index = str.match(/\d/)[0];
res[index] ||= [];
res[index].push(str);
return res;
},{}));
这里考虑到数字可能不连续所以用的key-value来作为集合,如果是连续的可以直接使用数组,可以少一次遍历
const arr = ['A1', 'B1', 'C1', 'E1', 'A2', 'C2', 'D2', 'H2', 'A3', 'E3']
const res = []
let temp = {}
arr.map(v => {
let value = v.match(/\d$/)
if (temp[value[0]]) {
temp[value[0]].push(value['input'])
} else {
temp[value[0]] = [value['input']]
}
})
console.log(Object.values(temp));
9 回答9.4k 阅读
6 回答5.1k 阅读✓ 已解决
5 回答3.7k 阅读✓ 已解决
3 回答10.5k 阅读✓ 已解决
4 回答8k 阅读✓ 已解决
7 回答10.1k 阅读
4 回答7.4k 阅读
如果使用 lodash,那就是一句话的事儿,
但是要算法,其实就是自己写那个
groupBy
。groupBy
的结果肯定是键值对(用 List 还是用 Map 另说)。其中键是组名,在这里就是第 1 个字母之后的内容;值是一个列表,保存着分到这个组中的元素集,看注释上面这个例子是用 Map 来保存的键值对,反正都写了,再补个 List 保存键值对的,注释就不写了,应该能理解