2015-10-14 2 views
2

Я пытаюсь сортировать JSON по дате выпуска по случайным, по алфавиту или по популярности. Я не уверен, что ответ здесь, я проверил, и я не могу понять, это для меня.Сортировка элементов JSON, отвечающих определенным критериям

Мой JavaScript JQuery код захватывает файл JSON для меня:

$.getJSON("js/example.json", function(data) { 
    $.each(data.articles, function() { 
     //code 
    }); 
}); 

Я хочу JavaScript, чтобы собрать данные из всех элементов в статьях и сортировать их. После этого его можно было бы добавить в HTML через for() или что-то лучше.

Вот что выглядит JSON.

{ 
    "articles":[ 
     { 
      "name":"aaa", 
      "date":"10/13/15", 
      "views":65 
     }, 
     { 
      "name":"ccc", 
      "date":"10/17/15", 
      "views":175 
     }, 
     { 
      "name":"bbb", 
      "date":"10/11/15", 
      "views":54 
     }, 
     { 
      "name":"ddd", 
      "date":"10/17/15", 
      "views":6 
     } 
    ] 
} 
+0

https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort – charlietfl

+1

Возможный дубликат [Сортировка JSON по значениям] (http://stackoverflow.com/questions/881510/sorting-json-by-values) –

+0

Упорядочить по полю? –

ответ

0

JavaScript имеет вид массива: http://www.w3schools.com/jsref/jsref_sort.asp

Никогда не возражаете, это было сказано мне, что эта связь не имеет соответствующих примеров. Тем не менее, я действительно думаю, что это то, что вы ищете.

+0

Это не сработает для объекта..Link содержит только массив 'string' –

+0

@SarjanDesai Array sort отлично работает с такими объектами, как указано выше. Вас беспокоит тот факт, что он ассоциативен? –

+1

'link' не показывает какого-либо конкретного примера, связанного с вопросом ... –

0

Fiddle:

https://jsfiddle.net/ppLso0mg/

Вы можете, как правило, используют функцию someArr.sort(), которая принимает функцию компаратора. Функция работает, давая вам a и b, которые вы должны определить.

Ниже приведен пример 3 разных компараторов для 3 разных свойств вашего объекта JSON. Я позволю вам использовать свое воображение, как вы могли бы объединить их в одну большую функцию. Но это должно хотя бы проиллюстрировать, как это работает.

var json = 
[ 
{ 
"name": "aaa", 
"date": "10/13/15", 
"views": 65 
}, 
{ 
"name": "ccc", 
"date": "10/17/15", 
"views": 175 
}, 
{ 
"name": "bbb", 
"date": "10/11/15", 
"views": 54 
}, 
{ 
"name": "ddd", 
"date": "10/17/15", 
"views": 6 
} 
]; 

var sortFunctions = 
{ 
    name: function(a, b) 
    { 
     return a.name.localeCompare(b.name); 
    }, 
    date: function(a, b) 
    { 
     if(a.date == b.date) 
     { 
      return 0; 
     } 

     var aDate = new Date(a.date); 
     var bDate = new Date(b.date); 

     return aDate > bDate ? 1 : -1; 
    }, 

    views: function(a, b) 
    { 
     if(a.views == b.views) 
     { 
      return 0; 
     } 

     return a.views > b.views ? 1 : -1; 
    } 
}; 

json.sort(sortFunctions.name); 
console.log(json); 

json.sort(sortFunctions.date); 
console.log(json); 

json.sort(sortFunctions.views); 
console.log(json); 
+0

Я думаю, вам нужно сделать немного больше _work_ с строками даты - это перекрестный браузер, международный PITA –

+0

Определенно. Это всего лишь краткая демонстрация. Для этого есть библиотеки. ;) – teh1

0

Вы можете указать собственную функцию сравнения для метода сортировки массива Функция компаратора должны получать 2 параметров и возврата:

  • -1, если первый параметр должен идти перед тем второй в отсортированном массиве.
  • 0, если вы считаете оба параметра равными равным (каждый может пойти раньше).
  • 1, если первый параметр должен быть отправлен после второй параметр.

Используя это, вы можете создать свою собственную функцию ad hoc compator и отсортировать массив, используя свой собственный критерий. В качестве примера, вы можете увидеть здесь функцию для сортировки вашего массива на основе его собственности имени и другую для сортировки на основе его собственности просмотров:

function compareByName(a, b) { 
    var namea = a.name, nameb = b.name; 
    for(var i = 0; i < namea.length && i < nameb.length; i++) { 
     if(namea.charCodeAt(i) !== nameb.charCodeAt(i)) 
      return namea.charCodeAt(i) - nameb.charCodeAt(i); 
    } 
    return namea.length - nameb.length; 
} 

function compareByViews(a, b) { 
    return a.views - b.views; 
} 

С теми функциями, созданных и с вашим объектом, содержащей статью, сохраненной в data, вы можете сортировать это так:

data.articles.sort(compareByName); //sort by name 
data.articles.sort(compareByViews); //sort by views 

вы можете увидеть полный пример работает here.

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