2017-01-08 2 views
1

ターゲットオブジェクトのキー/値をソースオブジェクトから拡張しようとしていますが、ターゲットオブジェクトの既存のキー/値を上書きしません。意味:オブジェクトのプロパティを上書きせずに拡張する

var obj1 = { 
    a: 1, 
    b: 2 
}; 
var obj2 = { 
    b: 4, 
    c: 3 
}; 
extend(obj1, obj2); 
console.log(obj1); // --> {a: 1, b: 2, c: 3} 

興味深いことに、私はObject.assign(obj1,obj2);を見つけましたが、キー/値を上書きします。

私はが存在する場合にはそれらを上書きしないでください。存在しない場合は、それらを追加します。

平易なJavaScriptで助けてください。

答えて

0

単純なループです。あなただけ列挙独自のプロパティをしたい場合は、:

Object.keys(obj2).forEach(function(key) { 
    if (!(key in obj1)) { 
     obj1[key] = obj2[key]; 
    } 
}); 

あなたはすべての列挙のプロパティたい場合:

var key; 
for (key in obj2) { 
    if (!(key in obj1)) { 
     obj1[key] = obj2[key]; 
    } 
} 

キー(しゃれ)が対象かどうかを示しますinオペレータは、そこにあるビット(独自の、または継承を介した)プロパティを持ちます。

は、オブジェクトが指定された名前とその自身(継承されない)性質を持っている場合にのみ、あなたを言うだろうObject.prototype.hasOwnPropertyあります:

Object.keys(obj2).forEach(function(key) { 
    if (!obj1.hasOwnProperty(key)) { 
     obj1[key] = obj2[key]; 
    } 
}); 

より:

0

あなたのためにJSで利用可能な組み込み関数はありません。

あなたは

var x = {a:10}; 
var y = {a:5, b: 20}; 

merge(x,y); 

function merge(objSrc, objTarget){ 
return Object.keys(objTarget).reduce(function(src, prop){ 
    if(!src.hasOwnProperty(prop)) src[prop] = objTarget[prop]; 
    return src; 
}, objSrc); 
} 

console.log(x); {a:10, b:20} 

Object.keys()が同じことを返しますので、上記のコードは、列挙独自のプロパティの上にマージを行うだろうP.S、それを行うために、独自のロジックを記述する必要があります。

関連する問題