我可以使一个对象与另一个对象具有相同的顺序吗?

Posted

技术标签:

【中文标题】我可以使一个对象与另一个对象具有相同的顺序吗?【英文标题】:Can I make one object have the same order as another object? 【发布时间】:2016-12-12 08:58:01 【问题描述】:

我知道这个问题的标题已经没有意义了,因为对象的本质是无序的。但是,我认为如果您看一下此处链接的屏幕截图,它会更有意义。

Picture of the two objects in my console.log

这就是正在发生的事情。我正在创建一个名为 $scope.gameConfigs 的对象,它本身是根据我从服务器调用(一个配置对象)接收到的数据创建的。这个 $scope.gameConfigs 创建了一组下拉菜单。

基本上,如果数据存在,我要做的是让下拉菜单显示以前保存的数据。当保存的数据存在时,服务器返回一个包含所有保存数据的对象。此数据按数字排序。我的问题是,这个保存的数据并不总是与我创建的 $scope.gameConfigs 中的数据相同,这导致我的下拉列表中出现空白字段。

如果您查看我链接的屏幕截图,您可以看到 $scope.gameConfigs(旁边写有第 30 行的对象)中的键是 Map、Server 和 Mode。

第二个对象,即从服务器返回的保存数据,是一组对象,每个对象都有一个名称属性(即下拉菜单的名称)。如果你看一下,顺序是服务器、地图和模式。

我的问题是,如何让 Saved Data 对象复制我的 $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);
        );
      );
    ;

我知道这是一篇很长的文章,我非常感谢任何能够帮助我解决这个问题的人。谢谢!

【问题讨论】:

就像你说的,对象是无序的。无法保证键的显示顺序。充其量,您可以获取对象的键 (Object.keys(obj)),然后对它们进行排序,最后打印出每个键的每个值。但是您不能让 Chrome 按特定顺序显示对象键。你也可以编写一个toString 函数并调用它。 你可以使用 ES6 Map 你应该简化问题。我很确定您的问题可以用两行来概括,并且没有代码示例,无论如何它都会很有趣;D 我认为您可能正在使用与我相同的平台理念。我想给你发消息,但 SO 上没有这样的东西。我想合作,但此评论可能会在两分钟内被标记为垃圾邮件。请通过 g 的 Felipe d mullen 与我联系。嘛。 i.l 如果您有任何兴趣 【参考方案1】:

你可能会喜欢

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);

【讨论】:

以上是关于我可以使一个对象与另一个对象具有相同的顺序吗?的主要内容,如果未能解决你的问题,请参考以下文章

控制静态对象构造函数的顺序

如何比较两个没有顺序的具有相同属性的JSON?

我可以有两个具有相同属性名称的对象吗? [复制]

将 NSManagedObject 数组与另一个“对象”类型 Swift 2 的数组进行比较

面向对象

Protobuf 多对象序列化顺序?