2017-04-05 55 views
0

我想盡可能有效地找到任意數量的對象之間的交集。這些對象都包含其他子對象,每個子對象都存儲在父級上的唯一鍵下。出於我的目的,可以肯定的是,當比較對象1上的子對象a與對象2上的子對象a時,內容是相同的,所以我不在乎是否一個覆蓋另一個。到目前爲止,這是我一起工作的解決方案,但恐怕它是沒有效率不夠:任意數量的對象的交集

function intersectObjects(...objects){ 
    /*NOTE: This function will overwrite values on duplicate keys*/ 
    var returnObj; //temp variable to store the return value 
    objects.forEach((obj, i) => { 
    //on the first loop store my object 
    if (i == 0) returnObj = obj; 
    else { 
     //Get an array of all properties currently being returned 
     const returnProps = Object.getOwnPropertyNames(returnObj); 
     //Loop over the properties array 
     returnProps.forEach((propKey, j) => { 
     //If the current property does not exist on the return object 
     //Then delete the property on the return object 
     if(!obj[returnProps[j]]) delete returnObj[returnProps[j]]; 
     }); 
    } 
    }); 
    return returnObj; 
} 

有沒有更有效的解決方案呢?有沒有一個圖書館能夠有效地處理這個功能和功能?有沒有這樣的功能,我不知道?將不勝感激任何這些問題的答案。

回答

1

您可以使用此ES6功能,不發生變異任何輸入對象的,但返回一個新問題:

function intersectObjects(...objects) { 
 
    return !objects.length ? {} 
 
     : Object.assign(...Object.keys(objects[0]).filter( 
 
       key => objects.every(o => key in o) 
 
      ).map(key => ({ [key]: objects[0][key]}))); 
 
} 
 

 
// Sample run 
 
var data = [ 
 
    { a: 1, b: 2, c: 3, d: 4, e: 5}, 
 
    {  b: 2, c: 3, d: 4, e: 5, f: 6}, 
 
    { a: 1, b: 2,  d: 4, e: 5}, 
 
    { a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7} 
 
]; 
 
var result = intersectObjects(...data); 
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

注意,對象上執行delete是一項代價高昂的操作,並且會削弱引擎可以尋求和應用的優化。

+0

這正是我所期待的,儘管有點難以理解。非常感謝! –

0

如果沒有樣品數據進行測試,我無法告訴您這是否可以滿足您的需求,但您可以試試。

function intersectObjects(...objects) { 
    return Object.assign.apply(null, objects); 
} 
+0

這會給工會,而不是交集。 – trincot