2017-07-07 2 views
0

問題:私はJSグローバル変数を持っています。これは、 "メニュー構成"を持つオブジェクトであるかどうかを確認して、欠落している構成を取り込みます。JS:ネストされたオブジェクト/プロパティにオブジェクトを動的に取り込み/結合する>より簡単な方法がありますか?

だから、この作品は、このAS2に基づいています。

 var result_array = re.result.items; 

     _global.menu_array = new Array(); 
     var menu_type_num:Number = -1; 
     var menu_group_num:Number = -1; 
     var menu_id_num:Number = -1; 
     for (var i=0; i<result_array.length; i++){ 
      if (menu_type_num != result_array[i].menu_type){ 
       menu_type_num = result_array[i].menu_type; 
       menu_group_num = -1; 
       var type_array:Array = new Array(); 
       _global.menu_array[menu_type_num] = type_array; 
      } 
      if (menu_group_num != result_array[i].menu_group){ 
       menu_group_num = result_array[i].menu_group; 
       var group_array:Array = new Array(); 
       _global.menu_array[menu_type_num][menu_group_num] = group_array; 
      } 
      var menu_obj:Object = new Object(); 
      menu_id_num = menu_obj.menu_id = Number(result_array[i].menu_id); 
      menu_obj.menu_text = result_array[i].menu_text; 
      _global.menu_array[menu_type_num][menu_group_num][menu_id_num] = menu_obj; 
     } 

私はJSでこの溶液に達しました:これは動作します

result.then(function(res) 
    { 
     if(!_MEV2_GLOBAL.hasOwnProperty("menu_array")) 
     { 
      _MEV2_GLOBAL.menu_array = {}; 
     } 

     res.forEach(r => 
     { 
      if(!_MEV2_GLOBAL.menu_array.hasOwnProperty(r.menu_type)) 
      { 
       _MEV2_GLOBAL.menu_array[r.menu_type] = {}; 
      } 


     if(!_MEV2_GLOBAL.menu_array[r.menu_type].hasOwnProperty(r.menu_group)) 
      { 
       _MEV2_GLOBAL.menu_array[r.menu_type][r.menu_group] = {}; 
      } 

      if(!_MEV2_GLOBAL.menu_array[r.menu_type][r.menu_group].hasOwnProperty(r.menu_id)) 
      { 
       _MEV2_GLOBAL.menu_array[r.menu_type][r.menu_group][r.menu_id] = { 
        menu_id: r.menu_id, 
        menu_text: r.menu_text 
       }; 
      } 
     } 
    } 

をしかし、すべてのサブレベルのためならばやって...ください私は別の方法、何かを減らしたり、何か、より効果的かつ簡潔な何かを持っていますか?

私はJSについて少し知っていますが、私の解決策は最善の方法ではありません。それとも私が「諸悪の根源」に落下しています:P

EDIT: 入力がのIndexedDB「テーブル」から来ているので、結果は上のものと類似したオブジェクト(「行」)で作られています写真: このResultSetはGlobalVarに挿入されている必要があり

for example, "t_menus_gre" select is the input

が、それはこのような構造に従ってください: this object is my GlobalVar and should include a subObject['menu_array'] with menus configs by type/group/id

+0

入力の例と期待される出力を教えてください。 – tiagodws

+0

私は自分の質問を更新しました、あなたが求めていたことを願っています;) – rantunes

答えて

0

わかりました...私は正直、私はそのメニュー構成の背後にあるロジックを理解してないと思うけどあなたのコードだけに基づいて、私は以下の改善を行うことができました:

result.then(res => { 

    _MEV2_GLOBAL.menu_array = _MEV2_GLOBAL.menu_array || {}; 
    const array = _MEV2_GLOBAL.menu_array; 

    res.forEach(r => { 
     array[r.menu_type] = array[r.menu_type] || {}; 
     array[r.menu_type][r.menu_group] = array[r.menu_type][r.menu_group] || {}; 
     array[r.menu_type][r.menu_group][r.menu_id] = array[r.menu_type][r.menu_group][r.menu_id] || { menu_id: r.menu_id, menu_text: r.menu_text }; 
    }); 

}); 

あなただけの値が定義されているかどうかを確認したい場合は、Javascriptを常にfalseとしてnullundefinedfalse""0を評価します。

このようにしてarray[r.menu_type] = array[r.menu_type] || {};を実行すると、array[r.menu_type]が未定義の場合は{}を受信します。

何らかの形であなたを助けてくれることを願います。

+0

古いフラッシュゲームのものです(ドキュメントはまったくありません)、これをhtml5/JSに変換する必要があります。これはオンラインで、今はほぼ完全にオフラインになっているはずです。私は古いロジックを維持しており、この設定はanimateCCによってキャンバス(古いフラッシュ変換済み)で使用されます。 – rantunes

+0

うーん、ok!私が書いたコードを試しましたか? :) @rantunes – tiagodws

+1

それはまだ想定どおり動作し、はるかにクリーンです。あなたの助けてくれてありがとう、私はこのような "三成分の贖い"をすることができるか分からなかった! – rantunes

関連する問題