如何将数组中的相同数字归为一组?
我有以下数字数组:
var arr = [1,1,1,1,2,2,3,3,3,4,5,5,6];
我的输出应该是
[[1,1,1,1],[2,2],[3,3,3],4,[5,5],6]
答案 0 :(得分:2)
您可以缩小数组,并检查前一个是否具有相同的值,如果不采用数组或该值,则取决于下一个元素。
var array = [1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5, 6],
grouped = array.reduce((r, v, i, a) => {
if (v === a[i - 1]) {
r[r.length - 1].push(v);
} else {
r.push(v === a[i + 1] ? [v] : v);
}
return r;
}, []);
console.log(grouped);
答案 1 :(得分:1)
这是仅用一个Array.reduce
来完成此操作的另一种方法:
var arr = [1,1,1,1,2,2,3,3,3,4,5,5,6]
const grp = arr.reduce((r,c,i,a) => {
r[c] = [...r[c] || [], c]
r[c] = (a[i+1] != c && r[c].length == 1) ? r[c][0] : r[c]
return r
}, {})
console.log(Object.values(grp))
这个想法是要跟踪reduce中接下来要发生的事情,如果与当前项目不同,请检查该项目的当前累加器数组,如果等于1,则获取它的第一项。 / p>
答案 2 :(得分:0)
您可以将数组转换为字符串,并使用正则表达式匹配相同的字符,然后使用.map()
准备目标结构
var arr = [1,1,1,1,2,2,3,3,3,4,5,5,6];
var newArr = arr.join('').match(/(\w)\1*/g).map(function(val){
return val.length == 1 ? +val : val.split('').map(Number);
});
console.log(newArr);
答案 3 :(得分:0)
您可以为此使用reduce array方法。
const arr = [1,1,1,1,2,2,3,3,3,4,5,5,6];
const resultArr = arr.reduce((item, index) =>{
if (typeof item.last === 'undefined' || item.last !== index) {
item.last = index;
item.arr.push([]);
}
item.arr[item.arr.length - 1].push(index);
return item;
}, {arr: []}).arr;
console.log(resultArr);
答案 4 :(得分:0)
arr.sort();
new_arr = [];
arr.reduce(function (r, current_item) {
if (current_item !== r) {
new_arr.push([]);
}
new_arr[new_arr.length - 1].push(current_item);
return current_item;
}, undefined);
答案 5 :(得分:0)
这个怎么样?
const arr = [1,1,1,1,2,2,3,3,3,4,5,5,6]
const hashMap = {}
for(const num of arr) {
if (hashMap[num] !== undefined) { // To handle (0)s If any
if (Array.isArray(hashMap[num])) {
hashMap[num].push(num)
} else {
hashMap[num] = [hashMap[num], num] // add older and new value.
}
} else {
hashMap[num] = num
}
}
const result = Object.values(hashMap)
console.log(result)
答案 6 :(得分:0)
您可以使用 lodash 如下所示获取具有相关重复项的元素映射
_.groupBy([6, 4, 6,6,4,2])
与输出
Object {4: [4], 6: [6, 6]}
如果你想把它转换成数组,你可以得到对象的值
Object.values(_.groupBy([6, 4, 6,6,4,2]))
有输出
[[4], [6, 6]]
答案 7 :(得分:0)
var arr = [1,1,1,1,2,2,3,3,3,4,5,5,6];
var arr2 = _.groupBy(arr);
var result = Object.keys(arr2).map(k => {return arr2[k]} );
console.log(result)
var arr = [1,1,1,1,2,2,3,3,3,4,5,5,6];
const groupBy = (x,f)=>x.reduce((a,b)=>((a[f(b)]||=[]).push(b),a),{});
var arr2 = groupBy (arr, v => v);
var result = Object.keys(arr2).map(k => {return arr2[k]} );
console.log(result)