2014-10-20 17 views
23

Jak mogę zamówić przez klucz jako liczbę całkowitą?Sortuj według klucza obiektu w ng-repeat

Mam następujący obiekt;

$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"> 

Obecna kolejność wyjścia jest 1,10,11,12,13,14,2,20,3,4,5,6

Ale chcę 1,2,3,4,5,6,10,11,12,13,14,20

| orderBy:key 

nie działają na mnie.

Wszelkie pomysły?

Dzięki!

+0

Nie można - dyrektywa 'orderBy' wewnątrz' ng-repeat' ma zastosowanie tylko do tablic. – tymeJV

+0

hmm ... możesz być w stanie z filtrem, który konwertuje go na tablicę obiektów, z których każda ma dwie właściwości, 'klucz: 'nazwę kluczową', wartość: ', ale będziesz oczywiście miał wtedy zmienić szablon, aby pasował do tej struktury. –

Odpowiedz

18

Opcja może być wykorzystana filtr pośredni.

PLUNK I Code Snippet

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>

UWAGA:

Powyższy filtr wymaga underscore.js, jeśli nie używasz go, można przepisać filtr.

+2

Nie używam znaku podkreślenia .js, czy mogłabyś go przepisać? – Scipion

+1

Bower w wersji spakowanej tego filtra: https://github.com/petebacondarwin/angular-toArrayFilter –

2

Myślę, że sortuje się z konwersją do tablicy. kalambur przeznaczony.

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 ten punker nie żyje. –

+0

To zależy od kolejności iteracji właściwości obiektu "obj", co nie jest gwarantowane, zobacz 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; 

    } 
}])