2016-12-02 112 views
1

我有一個包含8個元素的JavaScript數組,並且一些元素正在重複。我想爲相同的元素創建單獨的數組。爲javascript中的重複元素創建新陣列

例如: 原數組是[1,1,1,3,3,1,2,2] 所得陣列將是[1,1,1,1],[3,3], [2,2]

我想要一個功能類似於此:

var array=[1,1,1,3,3,1,2,2]; 
 

 

 

 
var createNewArrays=function(array){ 
 
    for (var i = 0; i < array.length; i++) { 
 
     for (var j = 0; j < array.length; j++) { 
 

 
     } 
 
    } 
 
    
 
};

回答

1

您可以使用散列表作爲子排列的參考ys收集。

var array = [1, 1, 1, 3, 3, 1, 2, 2], 
 
    result = []; 
 

 
array.forEach(function (a) { 
 
    a in this || result.push(this[a] = []); 
 
    this[a].push(a); 
 
}, Object.create(null)); 
 

 
console.log(result);

0

假設您想要得到的陣列是由他們所代表的價值鍵控的對象的屬性。你只需通過數組循環,創建或添加到陣列上的物體的屬性,當您去:

var array=[1,1,1,3,3,1,2,2]; 
 
var result = {}; 
 
array.forEach(function(entry) { 
 
    (result[entry] = result[entry] || []).push(entry); 
 
}); 
 
console.log(result);

這有點密集,這裏有一個更清晰的版本:

var array=[1,1,1,3,3,1,2,2]; 
 
var result = {}; 
 
array.forEach(function(entry) { 
 
    var subarray = result[entry]; 
 
    if (!subarray) { 
 
    subarray = result[entry] = []; 
 
    } 
 
    subarray.push(entry); 
 
}); 
 
console.log(result);

1

var arr = [1,1,1,3,3,1,2,2]; 
 

 
var hash = Object.create(null); 
 

 
var result = arr.reduce(function(r, n) { 
 
    if(!hash[n]) { 
 
    hash[n] = []; 
 
    r.push(hash[n]); 
 
    } 
 
    
 
    hash[n].push(n); 
 
    
 
    return r; 
 
}, []); 
 

 
console.log(result);

和使用Map一個ES6溶液,和spread

const arr = [1,1,1,3,3,1,2,2]; 
 

 
const result = [...arr.reduce((r, n) => 
 
    r.set(n, (r.get(n) || []).concat(n)), 
 
new Map()).values()]; 
 

 
console.log(result);