2014-10-20 21 views
23

Anahtar olarak tamsayı olarak nasıl sipariş verebilirim?Nesne anahtarına göre sırala ng-yinele

Aşağıdaki Nesne var;

$scope.data = { 
    "0": { data: "ZERO" }, 
    "1": { data: "ONE" }, 
    "2": { data: "TWO" }, 
    "3": { data: "TREE" }, 
    "5": { data: "FIVE" }, 
    "6": { data: "SIX" }, 
    "10":{ data: "TEN" }, 
    "11": { data: "ELEVEN" }, 
    "12": { data: "TWELVE" }, 
    "13": { data: "THIRTEEN" }, 
    "20": { data: "TWENTY"} 
} 

HTML:

<div ng-repeat="(key,value) in data"> 

akım çıkışı emri 1,10,11,12,13,14,2,20,3,4,5,6

olduğu Ama benim için işe yaramaz 1,2,3,4,5,6,10,11,12,13,14,20

| orderBy:key 

istiyorum.

Herhangi bir fikrin var mı?

Teşekkürler!

+0

Yapamazsınız - 'ng-yineleme' içindeki 'orderBy' yönergesi yalnızca diziler için geçerlidir. – tymeJV

+0

hmm ... her biri iki özelliğe sahip bir nesne dizisine dönüştüren bir filtreyle mümkün olabilir, 'anahtar:' anahtar adı ', değer: <özellik değeri> 'ancak tabi ki sonra şablonunuzu bu yapıya uyacak şekilde değiştirmek için –

cevap

18

Bir seçenek, bir ara filtre kullanılacaktır.

PLUNK VE Kod Parçacığı

var app = angular.module('app', []); 
 

 
app.controller('MainCtrl', function($scope) { 
 
    
 
    $scope.template = { 
 
    "0": { data: "ZERO" }, 
 
    "1": { data: "ONE" }, 
 
    "2": { data: "TWO" }, 
 
    "3": { data: "TREE" }, 
 
    "5": { data: "FIVE" }, 
 
    "6": { data: "SIX" }, 
 
    "10":{ data: "TEN" }, 
 
    "11": { data: "ELEVEN" }, 
 
    "12": { data: "TWELVE" }, 
 
    "13": { data: "THIRTEEN" }, 
 
    "20": { data: "TWENTY"} 
 
    } 
 
    
 
}); 
 

 
app.filter('toArray', function() { return function(obj) { 
 
    if (!(obj instanceof Object)) return obj; 
 
    return _.map(obj, function(val, key) { 
 
     return Object.defineProperty(val, '$key', {__proto__: null, value: key}); 
 
    }); 
 
}});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore.js"></script> 
 

 
<body ng-app="app" ng-controller="MainCtrl"> 
 
    <div ng-repeat="(key, value) in template| toArray | orderBy:key">{{key}} : {{value.$key}} : {{value.data}}</div> 
 
<body>

NOT: Yukarıdaki filtre Underscore.js gerektirir

bunu kullanmak istemiyorsanız, filtreyi yeniden yazabilirsiniz.

+2

.js, yeniden yazabilir misin? – Scipion

+1

Bu filtrenin paketlenmiş versiyonudur: https://github.com/petebacondarwin/angular-toArrayFilter –

2

Sanırım bir diziye dönüştürme ile kendini hallediyor. Pun amaçlanmıştır.

var obj = {"3": {three:3}, 2: {two:2}, "5": {five:5}, 4: {four:4}, 
    1: {one:1}, 6: {six:6}, 10: {ten:10}, 11:{eleven:11} 
} 

$scope.arr = []; 

for (var o in obj) 
    $scope.arr.push(obj[o]) 
+0

FYI bu hakem öldü. –

+0

Bu, garanti edilmeyen "obj" nesnesinin özellik yineleme sırasına dayanır, bkz. Https://stackoverflow.com/questions/5525795/does-javascript-guarantee-object-property-order – Rich

0
app.filter('orderObjectBy', [function() { 
    return (filterObj, prop) => { 

    let arr = [] 
    //below is the loadash function you can use for in also 
    _.forEach(filterObj, function(value, key) { 
    arr.push({ 
    key: key, 
    value: value 
    }); 
    }); 

let sortedArr = _.sortBy(arr, val => val.value[prop]); 

    for (let variableKey in filterObj) { 
if (filterObj.hasOwnProperty(variableKey)) { 
    delete filterObj[variableKey]; 
    } 
    } 

    for (let data of sortedArr) { 
filterObj[data.key] = data.value; 
} 


    return filterObj; 

    } 
}])