我可以使一个对象与另一个对象具有相同的顺序吗?
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> 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);
【讨论】:
以上是关于我可以使一个对象与另一个对象具有相同的顺序吗?的主要内容,如果未能解决你的问题,请参考以下文章