2015-04-02 2 views
-1

У меня есть объект JSON объектов, как показано ниже:Сортировка объекта JSON, содержащий объекты

{ 
    "166": 
     { 
      "name":{"name":"name","val":"matt","order":""}, 
      "props":{"name":"props","val":"1","order":""} 
     }, 
    "147": 
     { 
      "name":{"name":"name","val":"chris","order":""}, 
      "props":{"name":"props","val":"4","order":""} 
     } 
} 

В JavaScript, как бы отсортировать этот объект со стороны валь имущества в реквизите объект?

+4

Это не массив ... –

+0

У вас нет массива. Как вы хотите упорядочить этот объект, купите его свойства/ключи (166, 147)? Проверьте [это ответы] (http://stackoverflow.com/questions/5467129/sort-javascript-object-by-key) или [это] (http://stackoverflow.com/questions/1359761/sorting-a-javascript -объект-на-имя-свойства). – skobaljic

+1

Это объект, а не массив. и вы НЕ имеете дело с Json, как это. json - формат транспортного кодирования. Вы расшифровываете это на нативную структуру (например, объект JS, массив PHP, blah blah blah), и вы сортируете THAT. Затем вы снова кодируете отсортированную структуру в json. –

ответ

1

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

var json = 
{ 
    "166": 
    { 
     "name": 
     { 
      "name":"name", 
      "val":"matt", 
      "order":"" 
     }, 
     "props": 
     { 
      "name":"props", 
      "val":"1","order":"" 
     } 
    }, 
    "147": 
    { 
     "name": 
     { 
      "name":"name", 
      "val":"chris", 
      "order":"" 
     }, 
     "props": 
     { 
      "name":"props", 
      "val":"4", 
      "order":"" 
     } 
    } 
}; 

var arr = []; 
for (var jsonProperty in json) { 
    if (json.hasOwnProperty(jsonProperty)) { 
     var propVal = json[jsonProperty]['props']['val']; 
     arr.push({val: propVal, obj: json[jsonProperty]}); 
    } 
} 
var sortedArray = arr.sort(function(a,b){return a.val-b.val}); 
+0

Это РАБОТАЛО, как я и хотел. Большое вам спасибо за вашу помощь. –

1

Как уже упоминалось в многочисленных комментариях, вы не сортируете объект. Сортировка подразумевает порядок, подразумевает сбор, подразумевает структуру данных.

Итак, во-первых, вам нужен массив объектов. Поэтому извлеките их в массив, итерации по клавишам. Затем используйте Array.sort с пользовательским компаратором.

var objectsToSort = { 
    "166": 
     { 
      "name":{"name":"name","val":"matt","order":""}, 
      "props":{"name":"props","val":"1","order":""} 
     }, 
    "147": 
     { 
      "name":{"name":"name","val":"chris","order":""}, 
      "props":{"name":"props","val":"4","order":""} 
     } 
} 

var objects = Object.keys(objectsToSort).map(function (key) { 
    return objectsToSort[key]; 
}); 

objects.sort(function (a, b) { 
    return a.val - b.val; 
}); 

Я заметил, что val является строковым представлением числа. Если вы хотите цифровой вида, либо изменить их чистые числа или изменить функцию сортировки выше использовать parseInt:

objects.sort(function (a, b) { 
    return parseInt(a.val, 10) - parseInt(b.val, 10); 
}); 

Я предпочитаю, чтобы изменить фактические данные, чем функции, потому что синтаксический анализ будет выполняться два раза в сравнение и сортировка обычно N * log (n). Таким образом, он будет работать 2 (N * log (n)).

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