昨日、2つのjavascriptオブジェクトを組み合わせることが必要になりました。 インターネットを介して大騒ぎして、2つのオブジェクトを結合する唯一の方法は、フィールドを別のフィールドにコピーすることであることを学びました。
主な機能:
- あるオブジェクトのプロパティを別のオブジェクトに再帰的にトラバースしてコピーします。出力には、最初と2番目のすべてのプロパティを含むオブジェクトがあります。
- ソースオブジェクトを再帰的にたどることなくプロパティをコピーします。この場合、出力は、最初と2番目のオブジェクトの元の構造を保持するオブジェクトになります。
- 2つのオブジェクトに同じ名前のプロパティがある場合、イベントの開発には2つのオプションがあります。
- 両方のプロパティを保持して-値の配列が形成されます
- ソースターゲットの置換
- 両方のプロパティを保持して-値の配列が形成されます
- コピー深度制限
まあ、実際には関数自体:
/** * * @param objS <i>object</i> * @param objT <i>&object</i> * @param rec <i>bool</i> - * " " * @param repl <i>bool</i> * - * @param max_l_rec <i>int</i> ( ) * 1 " " */ function objUnion(objS, objT, rec, repl, max_l_rec) { // var count_elem = objS.length; // , // - , - , // , if(!objT.hasOwnProperty("cur_l_rec")) { objT.cur_l_rec = 0; objT.summ_elem = 0; var cur_l_rec = 0; } else { objT.cur_l_rec++; cur_l_rec = objT.cur_l_rec; } // if(max_l_rec && objT.cur_l_rec == max_l_rec) { objUnion(objS, objT, rec, repl, max_l_rec); delete objT.cur_l_rec ; return; } // for(var key in objS) { // // - if(typeof(objS[key]) == 'object') { if(rec && ((max_l_rec && objT.cur_l_rec < max_l_rec)|| !max_l_rec)) { objUnion(objS[key], objT, rec, repl, max_l_rec); objT.cur_l_rec = cur_l_rec; // if(objT.cur_l_rec == 0) { objT.summ_elem ++; } continue; } } //, , // , if(objT[key] && !repl) { objT[key] = [objS[key],objT[key]]; } else { objT[key] = objS[key]; } } // if((objT.summ_elem == count_elem || !objS.hasOwnProperty('length')) && (objT.cur_l_rec == 0 && cur_l_rec == 0)) { delete objT.cur_l_rec ; delete objT.summ_elem ; } } // var obj1 = [ { field4 : { field9 : { field10 : 1 }, field8 : 2 }, field5 : 3 }, { field6 : 5, field7 : { field11 : 'green', field12 : 'black' } }, { field13 : 5, field14 : { field15 : 'green', field16 : 'black' } } ]; var obj2 = { field1 : 'green', field2 : 'square', field3 : 'small' }; // var link = obj2 objUnion(obj1, link, 1, 0, 1); // link = null; console.log(obj2);
ご清聴ありがとうございました。私の
jQueryとextend関数を使用してこの問題を解決できますが、1つの関数を使用するためにフレームワーク全体を接続しないでください。
PS私の機能が気に入らなかった場合、大きなリクエストがあります。具体的には、それが悪いとコメントに書いてください。私は喜んでそれを修正します。