2015-08-16 2 views
1

У меня есть простой JSON-файл с этим:Как заказать атрибутом JSon

{"Item1": {"p1": {"p1sub1": 8, "p1sub2": 7}, "p2": {"p2sub1": 6, "p2sub2": 5} }, 
"Item2": {"p1": {"p1sub1": 4, "p1sub2": 3}, "p2": {"p2sub1": 2, "p2sub2": 1} } } 

, который я получить так:

app.controller('customersCtrl', function($scope, $http) { 
     $http.get("content2.json") 
     .success(function (data) {$scope.items = data;}); 
}); 

И я показываю это в моем HTML:

<ul ng-repeat="(i, val) in items | orderBy:'p1.p1sub1'"> 
    <li>{{i}} - {{val.p1.p1sub1}} - {{val.p1.p1sub2}} - {{val.p2.p2sub1}} - {{val.p2.p2sub2}}</li> 
</ul> 

Я получаю это, независимо от того, что я положил в фильтр «orderBy»:

Item1 - 8 - 7 - 6 - 5 
Item2 - 4 - 3 - 2 - 1 

Есть ли способ заказать список по значениям «p1.p1sub1»?

Edit: То, что я хочу, чтобы заказать строки с тем, что их p1.subp1 значение имеет, чтобы господствующее/потомка (в данном примере, p1.p1sub1 8 для item1 и 4 для item2), например: господствующего

Item2 - 4 - 3 - 2 - 1 
Item1 - 8 - 7 - 6 - 5 

Descendent

Item1 - 8 - 7 - 6 - 5 
Item2 - 4 - 3 - 2 - 1 

конечно, это всего лишь небольшой образец файл. В конечном файле будет отсортировано множество элементов.

+4

очень простой ... объекты javascript не имеют порядка. Используйте массивы, если вы хотите заказать – charlietfl

+0

Я довольно новичок в javascript. Как я могу разобрать объект с помощью json для массивов? – Sergio

+1

Вы контролируете источник? Если это так, лучше всего реструктурировать данные там – charlietfl

ответ

3

Как @charlietfl сказал в комментариях, объекты Javascript/JSON не имеют права сортировки. К счастью, JSON поддерживает массивы, которые do имеют собственный заказ - даже индексирование! Массивы обозначаются как списки, разделенные запятыми, окруженные скобками, например. ["StringA", "StringB", "StringC"] создаст массив из трех элементов, содержащий эти строки в этом порядке.

Так как вы сказали, что вы можете изменить источник JSON, самый простой способ сделать то, что вы хотите бы разделить каждую деталь в свой собственный объект в массиве:

[ 
    { 
     "name": "Item1", 
     "p1": {"p1sub1": 8, "p1sub2": 7}, 
     "p2": {"p2sub1": 6, "p2sub2": 5}, 
    }, { 
     "name": "Item2", 
     "p1": {"p1sub1": 4, "p1sub2": 3}, 
     "p2": {"p2sub1": 2, "p2sub2": 1}, 
    } 
] 

(Если вы разбираете JSON из строки, не волнуйтесь, в JavaScript JSON.parse() обрабатывает массивы без вас делать ничего особенного.)

вы могли бы использовать упорядоченность массива, как есть, или использовать предложение orderBy аналогичного исходную попытку :

<ul ng-repeat="item in items | orderBy:'p1.p1sub1'"> 
    <li>{{item.name}} - {{item.p1.p1sub1}} - {{item.p1.p1sub2}} - {{item.p2.p2sub1}} - {{item.p2.p2sub2}}</li> 
</ul> 

Но если ваши фактические элементы использовать индексную-й схему имен, можно даже уронить свойство «имя» из файла JSON и использовать специальное $index свойство углового в:

<ul ng-repeat="item in items | orderBy:'p1.p1sub1'"> 
    <li>{{'Item' + $index}} - {{item.p1.p1sub1}} - {{item.p1.p1sub2}} - {{item.p2.p2sub1}} - {{item.p2.p2sub2}}</li> 
</ul> 

господствующее/Потомок заказ может быть контролируется путем префикса «p1.p1sub1» в orderBy либо с помощью «+», либо «-», например orderBy:'-p1.p1sub1' по убыванию.

+0

Спасибо! Это было очень приятное объяснение. Теперь я понимаю javascript и angularjs немного лучше. Я буду учиться :) – Sergio

Смежные вопросы