2016-04-27 71 views
4

我有一个数组里面有一些值,我希望返回另一个数组,其值分组到他们自己的数组中。在数组中相同的值组

所以我想达到的效果是这样的:

var arr = [1,1,2,2,2,3,3,4,4,4,4,5,6] 
var groupedArr =[[1,1],[2,2,2],[3,3],[4,4,4,4],[5],[6]] 
+0

您是否尝试过自己什么?请发布您的代码到目前为止。 – Archer

+0

您可能会先对数组进行排序,然后处理以像成员一样推入新数组,每次遇到新值时都会创建另一个数组。 * Array.prototype.reduce *是一个可能的候选人。 – RobG

+0

不要以为在这种情况下你需要排序。 – zozo

回答

4

这一建议与Array#reduce工程有序阵列。

var arr = [1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 6], 
 
    groupedArr = arr.reduce(function (r, a, i) { 
 
     if (!i || a !== r[r.length - 1][0]) { 
 
      return r.concat([[a]]); 
 
     } 
 
     r[r.length - 1].push(a); 
 
     return r; 
 
    }, []); 
 

 
document.write('<pre>' + JSON.stringify(groupedArr, 0, 4) + '</pre>');

1

这可能不是最优化的版本,但应该做的。这也适用于未排序的数组。

function abc(arr) { 
 
    var newObj = new Object(); 
 
    for (var i in arr) { 
 
    if (typeof newObj[arr[i]] == 'undefined') { 
 
     newObj[arr[i]] = new Array(); 
 
    } 
 
    newObj[arr[i]].push(arr[i]); 
 
    } 
 

 
    var groupedArr = new Array(); 
 

 
    for (i in newObj) { 
 
    groupedArr.push(newObj[i]); 
 
    } 
 

 
    return groupedArr; 
 
} 
 

 
console.log(abc([1, 1, 2, 2, 3, 3, 3, 4, 1]));

1

这是最简单的在我的脑海:

var arr = [1,1,2,2,2,3,3,4,4,4,4,5,6]; 
var grouped = {}; 
var groupedArr = []; 

//accumulate the values in an object, each key is an array 
for (var i = 0; i < arr.length; i++) { 
    if (!grouped[arr[i]]) grouped[arr[i]] = []; 
    grouped[arr[i]].push(arr[i]); 
} 

//loop through all the keys in the object and push the arrays to the master array 
var keys = Object.keys(grouped); 
for (var i = 0; i < keys.length; i++) { 
    groupedArr.push(grouped[keys[i]]); 
} 

console.log(groupedArr); 
0

我想你可以使用下面的代码:

var arr = [1,1,2,2,2,3,3,4,4,4,4,5,6] 
var groupedArray = []; 
var temp = arr.sort(); 
var tempArray = [arr[0]]; 
for(var i = 0; i < temp.length - 1; ++i){ 
    if(temp[i] == temp[i + 1]){ 
    tempArray.push(temp[i + 1]); 
    }else{ 
    groupedArray.push(tempArray); 
    tempArray = [temp[i + 1]]; 
    } 
} 
groupedArray.push(tempArray); 

现在groupedArray将包含结果

2

你在这里。顺便说一句,这与未排序的阵列以及一起使用。

var arr = [1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 6] 
var grpdArr = []; 

while(arr.length > 0){ 
    var item = arr[0]; 
    grpdArr.push(arr.filter(function(val) { 
     return val === item; 
    })); 

    arr = arr.filter(function(val){return val!==item}); 
} 


//console.log(arr, grpdArr); 

嗯,这应该做的。相当直线前进, 你得到的元素,然后删除它们。

1

随着forEach和临时数组

var arr = [1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 6]; 
 
var temp = []; 
 
var res = []; 
 

 
arr.forEach(function(e) { 
 
    if (temp.slice(-1) == e) temp.push(e); 
 
    else { 
 
     temp = [e]; 
 
     res.push(temp); 
 
    } 
 
}); 
 

 
document.write(JSON.stringify(res));