2016-08-05 4 views
5

私は、この質問のタイトルは、オブジェクトが本質的に順序付けられていないので、すでに意味が分かりません。しかし、ここにリンクされているこのスクリーンショットを見れば、それはより意味をなさないでしょう。あるオブジェクトを別のオブジェクトと同じ順序にすることはできますか?

Picture of the two objects in my console.log

はここで何が起こっているかです。 $ scope.gameConfigsというオブジェクトを作成しています。このオブジェクトは、サーバー呼び出し(プロビジョニングオブジェクト)から受け取るデータから作成されます。この$ scope.gameConfigsは、一連のドロップダウンメニューを作成します。

基本的には、データが存在する場合、以前に保存されたデータがドロップダウンメニューに表示されるようにしています。保存されたデータが存在する場合、サーバーはすべての保存されたデータを持つオブジェクトを返します。このデータは数値順に並べられています。私の問題は、この保存されたデータは、私が作成する$ scope.gameConfigsのデータと同じ順序であるとは限りません。その結果、空のフィールドがドロップダウンリストに表示されます。

私がリンクしているスクリーンショットを見ると、$ scope.gameConfigs(その隣に書かれた30行目のオブジェクト)のキーがMap、Server、Modeであることが分かります。

サーバーから返された保存されたデータである2番目のオブジェクトは、それぞれがnameプロパティ(ドロップダウンメニューの名前)を持つオブジェクトのグループです。それを見てみると、サーバー、マップ、モードの順です。

私の質問は、Saved Dataオブジェクトでmy $ scope.gameConfigsオブジェクトの順序をコピーするにはどうすればよいですか。それも可能ですか?そうでない場合は、どのような最善の方法を進めるでしょうか?ここで

は、それがすべてで助け場合、私は、あまりにも、私のページ/コントローラを持っているHTMLおよびコントローラです:

<form class="form-horizontal" ng-controller="GamePreferenceCtrl"> 
    <div ng-repeat="(name, section) in gameConfigs"> 
     <label ng-bind="name"></label> 
     <select class="form-control" ng-model="formData.settings[$index].value" ng-change="dropdownItemClicked(name, formData.settings[$index].value)"> 
      <option value="" disabled="disabled">---Please Select Option---</option> 
      <option ng-repeat="item in section" value="{{item.value}}" ng-bind="item.value"></option> 
     </select> 
    </div> 
    <div class="col-md-12" ng-include="gametemp"></div> 
    <div class="row"> 
     <div class="hr-line-dashed"></div> 
     <div class="text-center col-md-12 padding-15"> 
      <button class="btn btn-primary btn-lg" ng-click="saveGameSetting()" formnovalidate translate> 
       <i class='fa fa-circle-o-notch fa-spin' ng-if="showBusy"></i>&nbsp;Save 
      </button> 
     </div> 
    </div> 
</form> 

とコントローラ:

function GamePreferenceCtrl($scope, $filter, Tournament, Notification) { 
    $scope.$parent.child.game = $scope; 
    $scope.selectedItems = []; 
    $scope.formData = {}; 

    $scope.loadConfig = function() { 
     Tournament.loadGameConfig($scope.id).then(function (response) { 
     $scope.gameConfigs = {}; 

     if (response.data.tournamentPrefs) { 
      _.each(response.data.tournamentPrefs, function (val) { 
      if ($scope.formData.settings === undefined) { 
       $scope.formData.settings = []; 
      } 
      $scope.formData.settings.push({section: val.name, value: val.value}); 
      }); 
      $scope.formData = {}; 
     }; 

     $scope.dropdownItemClicked = function(name, value) { 
      if($scope.formData.settings === undefined) { 
       $scope.formData.settings = {}; 
       $scope.formData.settings[name] = value; 
      } else { 
      console.log('inside else'); 
       $scope.formData.settings[name] = value; 
      } 

     }; 

     _.each(response.data.provisions, function (val) { 
      if ($scope.gameConfigs[val.section] === undefined) { 
       $scope.gameConfigs[val.section] = []; 
      } 
      $scope.gameConfigs[val.section].push({name: val.key, value: val.value}); 
     }); 
     }); 
    }; 

私は、これは知っています長い読書と、私は本当にこれで私を助けることができるかもしれない誰にも感謝します。ありがとうございました!

+0

のように行うことができます。キーがどのような順序で表示されるかは保証されません。せいぜい、オブジェクトのキー( 'Object.keys(obj)')をソートし、最後に各キーの各値を出力することができます。しかし、クロムに特定の順序でオブジェクトキーを表示させることはできません。また、 'toString'関数を記述してそれを呼び出すこともできます。 –

+0

あなたはES6 'マップ'を使うことができます。 – gcampbell

+0

問題を簡素化する必要があります。私はあなたの質問が2行でコードサンプルなしで要約できると確信しています、とにかく十分に面白いでしょう; D –

答えて

0

使用すると、オブジェクトが順序付けられていない、言ったようにあなたは

var o = {z:1, f:2, a:7} 
 
    p = Object.assign({},o), 
 
    q = Object.assign(o) 
 
console.log(o, p, o === p); 
 
console.log(o, q, o === q);

関連する問題