2016-09-21 71 views
-1

對象的組陣列I有對象取決於值

[ 
    { values: [2, 7, 1] }, 
    { values: [1, 2, 7] }, 
    { values: [7, 1, 2] }, 
    { values: [3, 4, 5] }, 
    { values: [2, 1, 8] }, 
    { values: [2, 1, 8] }, 
] 

的陣列欲組這些目的連同與相同的值的其他對象。因此,由於前3個對象具有相同的值,所以這個對象數組應該分組爲3個組,下一個對象是獨立的,最後2個對象具有相同的值。

從示例中可以看出,這些值可以有不同的順序,但仍應該被認爲是相同的。

我正在考慮爲每個元素循環遍歷剩餘的元素,看看它們是否相似,但會導致O(n^2)

我想我應該從數組中已經分組的元素。

所以我怎麼可能,高效,集團作爲

[[first, second, third],[fourth],[fifth,sixth]] 

回答

2

像這樣做呢?

var data = [ 
 
    { values: [2, 7, 1] }, 
 
    { values: [1, 2, 7] }, 
 
    { values: [7, 1, 2] }, 
 
    { values: [3, 4, 5] }, 
 
    { values: [2, 1, 8] }, 
 
    { values: [2, 1, 8] }, 
 
]; 
 

 
var hash = {}; 
 
for(var obj of data) { 
 
    var key = obj.values.sort().join("-"); 
 
    if (!hash[key]) hash[key] = []; 
 
    hash[key].push(obj); 
 
} 
 
var result = []; 
 
for(var k in hash) result.push(hash[k]) 
 
console.log(result)

或者JS6變種:

var data = [ 
 
    { values: [2, 7, 1] }, 
 
    { values: [1, 2, 7] }, 
 
    { values: [7, 1, 2] }, 
 
    { values: [3, 4, 5] }, 
 
    { values: [2, 1, 8] }, 
 
    { values: [2, 1, 8] }, 
 
]; 
 

 
var hash = data.reduce((hash, obj) => { 
 
    const key = obj.values.sort().join("-"); 
 
    if (!hash[key]) hash[key] = []; 
 
    hash[key].push(obj); 
 
    return hash; 
 
}, []) 
 

 
var result = Object.keys(hash).map(k => hash[k]) 
 
console.log(result)

+0

沒錯這就是偉大的。我其實不在乎鑰匙。是否有可能給他們其他鍵(如1,2,3),並刪除'values'屬性中的空數組?我知道我可以使用'.filter(function(obj){return obj.values.length> 0;})...'但它足夠高效多次調用'obj.values'嗎? – Jamgreen

+0

@Jamgreen結賬更新 – ruX

+0

@Jamgreen關於'''.filter()'''我想這不是相關的問題,但我不明白爲什麼它不高效。當然,這取決於你的數據性質和數量 – ruX

1

您可以forEach()環和sort()

var arr = [ 
 
    { values: [2, 7, 1] }, 
 
    { values: [1, 2, 7] }, 
 
    { values: [7, 1, 2] }, 
 
    { values: [3, 4, 5] }, 
 
    { values: [2, 1, 8] }, 
 
    { values: [2, 1, 8] }, 
 
]; 
 

 
var result = []; 
 
arr.forEach(function(e) { 
 
    var s = [].concat(e.values).sort().join('|'); 
 
    if (!this[s]) { 
 
    this[s] = [e.values]; 
 
    result.push(this[s]); 
 
    } else { 
 
    this[s].push(e.values) 
 
    } 
 
}) 
 

 
console.log(result)