我有一组需要排序的 JSON 对象。数组需要按两个不同的属性排序。首先,数组应按 found 属性的字母顺序排序。其次,应该对数组进行排序,以便 website 属性按照 siteOrder 中指定的相同顺序下降。

var siteOrder = ['facebook', 'twitter', 'reddit', 'youtube', 'instagram'];
var data = [
    {found: 'booker', website: 'reddit'},
    {found: 'john', website: 'facebook'},
    {found: 'walter', website: 'twitter'},
    {found: 'smith', website: 'instagram'},
    {found: 'steve', website: 'youtube'},
    {found: 'smith', website: 'facebook'},
    {found: 'steve', website: 'twitter'},
    {found: 'john', website: 'instagram'},
    {found: 'walter', website: 'youtube'}
];

/* Example output: Sorted output by found, respecting the order of the websites specified
{found: 'booker', website: 'reddit'},
{found: 'john', website: 'facebook'},
{found: 'john', website: 'instagram'},
{found: 'smith', website: 'facebook'},
{found: 'smith', website: 'instagram'},
{found: 'steve', website: 'twitter'},
{found: 'steve', website: 'youtube'},
{found: 'walter', website: 'twitter'},
{found: 'walter', website: 'youtube'}
*/

我可以使用以下方法按找到的属性按字母顺序排序:
data.sort(function(a, b) {
    var textA = a.found.toUpperCase();
    var textB = b.found.toUpperCase();
    return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});

但是我不知道如何使它也遵守网站的指定顺序。

最佳答案

如果找到的 2 个对象的文本相同,则比较 siteOrder 中 2 个对象的网站索引。

data.sort(function (a, b) {
  var textA = a.found.toUpperCase();
  var textB = b.found.toUpperCase();
  var foundOrder = (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
  if (foundOrder === 0) {
    var indexA = siteOrder.indexOf(a.website);
    var indexB = siteOrder.indexOf(b.website);
    return (indexA < indexB) ? -1 : (indexA > indexB) ? 1 : 0;
  }
  return foundOrder;
});

关于javascript - JS : Sort JSON array by two different properties, 维护数组中指定的顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57899621/

10-17 02:52