2013-11-20 3 views
0

Я пытаюсь заказать объект, который я «преобразовал» из JSON. Я пытаюсь использовать эту функцию, которую я нашел на this question, но это, кажется, не работает в моем случае:Сортировка объекта

function sortJsonArrayByProperty(objArray, prop, direction){ 
    if (arguments.length<2) throw new Error("sortJsonArrayByProp requires 2 arguments"); 
    var direct = arguments.length>2 ? arguments[2] : 1; //Default to ascending 

    if (objArray && objArray.constructor===Array){ 
     var propPath = (prop.constructor===Array) ? prop : prop.split("."); 
     objArray.sort(function(a,b){ 
      for (var p in propPath){ 
       if (a[propPath[p]] && b[propPath[p]]){ 
        a = a[propPath[p]]; 
        b = b[propPath[p]]; 
       } 
      } 
      // convert numeric strings to integers 
      a = a.match(/^\d+$/) ? +a : a; 
      b = b.match(/^\d+$/) ? +b : b; 
      return ((a < b) ? -1*direct : ((a > b) ? 1*direct : 0)); 
     }); 
    } 
} 

А вот мой JsFiddle

Я хочу, чтобы отсортировать его в 3-х различных пути:

  • в хронологическом порядке по Dict (с использованием поля "времени")
  • в алфавитном порядке по Dict (с использованием поля "термин" ")
  • Все хронологические (игнорирование диктов)

Если этот объект не был таким вложенным я знаю, как это сделать. Могу ли я адаптировать эту функцию?

+0

Вместо того чтобы передавать весь объект 'sortJsonArrayByProperty', пройти каждый' terms' массива самостоятельно. Только для последнего пути вам придется объединить два массива. –

+0

Пожалуйста, создайте резервную копию, а не разместите фрагмент кода, который вы нашли и попытались описать, какую проблему вы пытаетесь решить. Покажите нам, как выглядят ваши данные и что вы хотите, чтобы отсортированный результат выглядел. Это единственный способ помочь вам. И, пожалуйста, разместите эту информацию в своем фактическом вопросе, а не в jsFiddle. Рассматривая данные в jsFiddle, неясно, что именно вы хотите отсортировать, так как там есть несколько массивов. – jfriend00

+0

В скрипке есть копия obj. – Andy

ответ

1

Вы не объяснили результат, который вы хотите, поэтому логическое предположение основано на данных в вашем jsFiddle.

ОК, вот данные из вашего jsFiddle в понятной форме:

var obj = {saved: [ 
    {"dict":"English","terms": [ 
     {"term":"car","rowId":"3487","time":"1384773838069"}, 
     {"term":"dog","rowId":"443","time":"1384776129957"}, 
     {"term":"plane","rowId":"16171","time":"1384776168253"}, 
     {"term":"bread","rowId":"127564","time":"1384959605196"}] 
    }, 
    {"dict":"French","terms": [ 
     {"term":"Monsieur","rowId":"934","time":"1384862250130"}, 
     {"term":"Croissant","rowId":"13612","time":"1384900161187"}, 
     {"term":"suis","rowId":"942","time":"1384900437068"}] 
     } 
    ] 
}; 

Я предполагаю, что вы хотите отсортировать каждый массив терминов отдельно по одному из полей в нем.

Вот как вы можете отсортировать его по полю:

// utility function for sorting an array by a key in alpha order 
function sortArrayAlpha(arr, key) { 
    arr.sort(function(a, b) { 
     return a[key].localeCompare(b[key]); 
    }); 
} 

// utility function for sorting an array by a key in parsed numeric order 
function sortArrayNum(arr, key) { 
    arr.sort(function(a, b) { 
     return parseInt(a[key], 10) - parseInt(b[key], 10); 
    }); 
} 

// sort by term 
var dicts = obj.saved; 
// cycle through each item in the saved array 
for (var i = 0; i < dicts.length; i++) { 
    var terms = dicts[i].terms; 
    sortArrayAlpha(terms, "term"); 
} 

// sort by time 
// cycle through each item in the saved array 
for (var i = 0; i < dicts.length; i++) { 
    var terms = dicts[i].terms; 
    sortArrayNum(terms, "time"); 
} 

// sort by rowId 
// cycle through each item in the saved array 
for (var i = 0; i < dicts.length; i++) { 
    var terms = dicts[i].terms; 
    sortArrayNum(terms, "rowId"); 
} 

И jsFiddle, который показывает выход: http://jsfiddle.net/jfriend00/vH8u7/. Вы можете увидеть в jsFiddle точный формат вывода для каждого вида.

Вот что-то термин выглядит следующим образом:

{"saved":[ 
    {"dict":"English","terms":[ 
     {"term":"bread","rowId":"127564","time":"1384959605196"}, 
     {"term":"car","rowId":"3487","time":"1384773838069"}, 
     {"term":"dog","rowId":"443","time":"1384776129957"}, 
     {"term":"plane","rowId":"16171","time":"1384776168253"}]}, 
    {"dict":"French","terms":[ 
     {"term":"Croissant","rowId":"13612","time":"1384900161187"}, 
     {"term":"Monsieur","rowId":"934","time":"1384862250130"}, 
     {"term":"suis","rowId":"942","time":"1384900437068"}] 
    } 
]} 
Смежные вопросы