2017-04-05 10 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

関連する問題