在JS中的数组中将数组中的相同值分组

时间:2018-11-20 17:06:51

标签: javascript arrays

如何将数组中的相同数字归为一组?

我有以下数字数组:

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]

8 个答案:

答案 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)

  1. 您可以使用 lodash (https://lodash.com/) 解决此问题:
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)

  1. 只有JS:
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)