2016-04-27 78 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));