2015-05-22 26 views
7

我的应用程序是建立在Angular JS上的,并且在服务器上有很多AJAX请求。 例如,在PHP我的格式输出阵列像为:什么是简单的方法来转换数组Angular JS中的对象?

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

echo json_encode($dialog); die(); 

但在角JS我得到不是数组,但对象:

549:Objectid_user: “549” 的消息:“你好“name_user:‘阿里 艾哈迈多夫’时间:1432070505

问题,如果使用ng-repeat则不起作用分选对象。 为什么在PHP中我设置数组,但在客户端获取对象?

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

+2

json_encode解析联想PHP中的数组作为json中的对象。 – Sagar

+0

关联数组**是**(JS-)对象。目前还不清楚你想要什么样的数据,你对'[1432070505,“你好”,“阿里阿赫莫多”]'满意吗? – Siguza

+0

好的,解决问题的方法是什么? – vaved

回答

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

11

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

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

ngRepeatDocumentation

不幸的是,这种方法不适用于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将按照字母顺序对对象属性进行排序,同时在ngRepeat中迭代它们。

为了使其在角1.3.x工作,甚至1.2.x你可以执行对象的变换对象的阵列,其中的每一个将包含keyvalue性质。这样您就可以在ngRepeat中使用它,并结合使用滤波器,包括orderBy。下面是一个代码:

的JavaScript

angular.module('app', []). 
    factory('srv', ['$http', function($http) { 
    var items = [], 
     loaded = false; 
    return { 
     getItems: function() { 
     if(!loaded) { // Lazy loading 
      $http.get('data.json').success(function(data) { // {key1: 'val1', key2: 'val2'} 
      Object.keys(data).forEach(function(key) { 
       items.push({key: key, value: data[key]}); 
      }); 
      }); 
      loaded = true; 
     } 
     return items; // [{key: 'key1', value:'val1'}, {key:'key2', value: 'val2'}] 
     } 
    }; 
    }]). 
    controller('ctrl', ['$scope', 'srv', function($scope, srv) { 
    $scope.items = srv.getItems(); 
    }]); 

HTML

<div ng-repeat="item in items | orderBy:'-key'">{{item.key}} => {{item.value}}</div> 

Plunker

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

+0

但是,如果我想显示从最新到最旧排序的数据?我试过'-key'和'+ key'没有区别。不工作 – vaved

+0

@vaved我用两个额外的解决方案更新了角1.4.x和更早版本的答案。请看一下,它也适用于过滤器。 – Vadim

+0

这可以工作,但这不是技术上无效的,因为它依赖于JavaScript维护对象属性的插入顺序,这是不能保证的? – Mike

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> 

由于toArray过滤器不与AngularJS发货,您可以定义一个为:

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

相关问题