2016-03-30 10 views
0

'2つのJavaScriptオブジェクトを拡張しています。そのうちの1つは、ファイルから継承される変数であり、もう1つはユーザープリファレンスを持つ単純なオブジェクトです。JavaScript内の子オブジェクトへのアクセス

// local prefs 
var prefs = { name: "Bob Barker", show: "Price is Right" }; 

// ajax in default prefs with dataType: "script" 
var defaultPrefs = { 
     studio: { name: "CBS", location: "Hollywood, CA" }, 
     producers: [ { name: "Producer1" }, { name: "Producer2" } ] 
} 

// merge prefs 
var mergedPrefs = $.extend(prefs, defaultPrefs); 

問題は、彼らがマージされたファイル内のオブジェクトあると私はprefs.producersまたはprefs.studioを使用して生産者やスタジオにアクセスすることはできませんです。どうすればこの問題を回避できますか?

+1

あなたがそれらにアクセスできるようにする*あなたは*したいと言っています'prefs.producers'を使ってアクセスするのをやめたいのですか? –

答えて

2

これを試してみてください:

var mergedPrefs = $.extend({}, prefs, defaultPrefs); 

元のオブジェクト(複数可)の新しいコピーを作成する空のオブジェクトを拡張します。

またしかしjQuery.extendObject.assignは常に(パフォーマンス向上のために)平坦であるのに対し、再帰的にマージする深いオプションを持って、同じタスクのためObject.assignを使用することができます。

+1

@MoreScratchこの回答は、あなたが望むことをするように思われますが、このためにjQueryを使う必要はありません。機能的には '$ .extend'と等価なES6' Object.assign'関数を使うこともできます。 – user162097

+0

ドキュメントから取ったもの:元のオブジェクトの両方を保持したい場合は、空のオブジェクトをターゲットとして渡すことができます:var object = $ .extend({}、object1、object2); https://api.jquery.com/jquery.extend/ –

2

このコードを試してください。ただし、私は、JQueryを使用しないようにするために、ES6でObject.assignをお勧めします。同じである:あなたのコードがObject.assignせずに作業して

var mergedPrefs = Object.assign({}, prefs, defaultPrefs); 

スニペット($.extendを使用して):

// local prefs 
 
var prefs = { 
 
    name: "Bob Barker", 
 
    show: "Price is Right" 
 
}; 
 

 
// ajax in default prefs with dataType: "script" 
 
var defaultPrefs = { 
 
    studio: { 
 
    name: "CBS", 
 
    location: "Hollywood, CA" 
 
    }, 
 
    producers: [{ 
 
    name: "Producer1" 
 
    }, { 
 
    name: "Producer2" 
 
    }] 
 
} 
 

 
// merge prefs 
 
var mergedPrefs = $.extend({}, prefs, defaultPrefs);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+1

AS ECMA Script第6版では、ES6をサポートしていないブラウザにポリラインを提供することができます。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/assignを参照してください。 – roland

関連する問題