在数组Angular JS中转换对象的简单方法是什么?

时间:2015-05-22 09:06:34

标签: javascript angularjs

我的应用程序是基于Angular JS构建的,并且在服务器上有很多AJAX请求。 例如,在PHP中,我将输出数组格式化为:

$dialog[$userId] = array(
   'time' => $key,
   'message' => $message['message'],
   'name_user'  => $info['name']
);

echo json_encode($dialog); die();

但是在Angular JS中,我得到的不是数组而是对象:

  

549:Objectid_user:" 549"消息:"你好" name_user:"阿里   阿赫梅多夫"时间:1432070505

如果使用ng-repeat然后无法对对象进行排序的问题。 为什么在PHP中我设置数组但在客户端获取对象?

将对象转换为数组的简单方法是什么?因为我在AJAX页面上有很多对象。

3 个答案:

答案 0 :(得分:11)

您不需要将对象转换为数组,以便在ng-repeat中迭代它。您可以使用以下语法:

<div ng-repeat="(key, value) in items">{{key}} => {{value}}</div>
ngRepeat

Documentation

很遗憾,此方法不适用于orderBy过滤器。要按特定顺序迭代对象属性,您需要实现自己的过滤器。它可能是这样的:

<强>的JavaScript

angular.module('app', []).
  filter('orderByKey', ['$filter', function($filter) {
    return function(items, field, reverse) {
      var keys = $filter('orderBy')(Object.keys(items), field, reverse),
          obj = {};
      keys.forEach(function(key) {
        obj[key] = items[key];
      });
      return obj;
    };
  }]);

<强> HTML

<div ng-repeat="(key, value) in items | orderByKey:'-'">{{key}} => {{value}}</div>

<强> Plunker

http://plnkr.co/edit/DJo0Y6GaOzSuoi202Hkj?p=preview

然而,即使这种方法只能从1.4.x开始,因为正如文档中所述,1.4.x之前的AngularJS将按字母顺序对对象属性进行排序,同时在{{1}中迭代它们}。

为了使其在Angular ngRepeat甚至1.3.x中工作,您可以执行将对象转换为对象数组,其中每个对象都包含1.2.x和{{1} }属性。这样,您就可以在key中结合包含value的过滤器使用它。这是一个代码:

<强>的JavaScript

ngRepeat

<强> HTML

orderBy

<强> Plunker

http://plnkr.co/edit/UXmlm1GKYRZzrOV5pMYT?p=preview

答案 1 :(得分:5)

假设你有一个像这样的对象:

$scope.myObj = {type:"Fiat", model:500, color:"white"};

然后,在您的角度Controller中,您可以执行以下操作:

$scope.array = [];
angular.forEach($scope.myObj, function(element) {
  $scope.array.push(element);
});

然后在HTML

<div ng-repeat="obj in array">{{obj}}</div>

以下是演示plunker

答案 2 :(得分:1)

orderBy是一个过滤器,可过滤require an array。因此,直接的解决方案是将其与toArray过滤器结合使用。假设您要使用time属性订购对象:

<ol>
  <li ng-repeat="value in objectWithValues | toArray | orderBy: 'time'">
    {{value.name_user}} said <q>{{value.message}}</q> on {{value.time|date}}
  </li>
</ol>

由于AngularJS未附带toArray过滤器,您可以将其定义为:

angular.module('ToArrayDemo', [])
  .filter('toArray', function() {
    return function(obj) {
      const result = [];
      angular.forEach(obj, function(val) {
        result.push(val);
      });
     return result;
   }
 });

请参阅https://plnkr.co/edit/E857InfrEGqToW0SvwOh?p=preview