如果多于一次出现的第一个js,则按字母顺序排序2个属性

时间:2017-07-26 17:19:16

标签: javascript sorting ecmascript-6

我有一个看起来像这样的数组

var arr =  [
      {
        firstName: 'Maria',
        lastName: 'S.',
        country: 'Peru',
        continent: 'Americas',
        age: 30,
        language: 'C'
      }, {
        firstName: 'Agustin',
        lastName: 'V.',
        country: 'Uruguay',
        continent: 'Americas',
        age: 19,
        language: 'JavaScript'
      }, {
        firstName: 'Precious',
        lastName: 'G.',
        country: 'South Africa',
        continent: 'Africa',
        age: 22,
        language: 'JavaScript'
      }, {
        firstName: 'Nikau',
        lastName: 'R.',
        country: 'New Zealand',
        continent: 'Oceania',
        age: 39,
        language: 'Ruby'
      }
]

我按照编程语言按字母顺序排列数组。但是,在某些情况下,有些开发人员使用相同的语言进行编码,然后我想按名字的字母顺序排序:

我写了以下我认为应该有效的功能。

首先,我按字母顺序对语言进行排序,然后在第二个排序函数中,如果语言相同,则应按字母顺序按名字排序。我认为错误最有可能发生在a.language != b.language但我不确定的情况下我将要返回的内容。

请参阅下面的代码。谁能发现我误解的地方?

function sortByLanguage(list) {

    return list.sort((a, b) => {
      if(a.language < b.language) return -1;
      if(a.language > b.language) return 1;
      return 0;
    }).sort((a, b) => {

        if(a.language === b.language) {
          if(a.firstName < b.firstName) return -1;
          if(a.firstName > b.firstName) return 1;
           return 0;
        }
        return 0;


    });
}

1 个答案:

答案 0 :(得分:3)

您首先尝试按语言对数组进行排序,然后使用第一个名称再次排序。这不起作用,因为第二次排序不尊重第一次排序。

您可以使用默认运算符(logical OR ||)来使用链式方法,这意味着如果第一部分未解析为真值,则会评估第二部分。

return a.language.localeCompare(b.language) || a.firstName.localeCompare(b.firstName);
//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//     sort first by language and if equal
//     it returns zero, then the other part
//     is evaluated
//                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//                                             sort by firstName

&#13;
&#13;
var array = [{ firstName: 'Maria', lastName: 'S.', country: 'Peru', continent: 'Americas', age: 30, language: 'C' }, { firstName: 'Agustin', lastName: 'V.', country: 'Uruguay', continent: 'Americas', age: 19, language: 'JavaScript' }, { firstName: 'Precious', lastName: 'G.', country: 'South Africa', continent: 'Africa', age: 22, language: 'JavaScript' }, { firstName: 'Nikau', lastName: 'R.', country: 'New Zealand', continent: 'Oceania', age: 39, language: 'Ruby' }]

array.sort(function (a, b) {
    return a.language.localeCompare(b.language) || a.firstName.localeCompare(b.firstName);
});

console.log(array);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;