在按字母顺序排列数组时,如何忽略单词“ the”?

时间:2018-11-20 04:49:43

标签: javascript arrays sorting

我有一个函数,可以按艺术家的字母顺序完美地记录我的唱片,但是很多艺术家的名字开头都有“ The”一词,我希望该函数在出现时可以忽略“ The”并在其后的单词按字母顺序排列。这是我的数组和函数的片段:

var recordCollection = [{
  "artist": "The Beatles",
  "title": "The Beatles",
  "year": "1968",
}, {
  "artist": "Led Zepplin",
  "title": "II",
  "year": "1969",
}];


function alphabetize() {
  recordCollection.sort(function(a, b) {
    var nameA = a.artist.toLowerCase(),
      nameB = b.artist.toLowerCase()
    if (nameA < nameB)
      return -1
    if (nameA > nameB)
      return 1
    return 0
  })
};

1 个答案:

答案 0 :(得分:3)

可以使用一个简单的正则表达式:

recordCollection.sort((a, b) => {
  const nameA = a.artist.toLowerCase().replace(/^the\s+/, '');
  const nameB = b.artist.toLowerCase().replace(/^the\s+/, '');
  return nameA.localeCompare(nameB);
});

如果您完全想要DRY,甚至可以:

recordCollection.sort((a, b) => {
  const [nameA, nameB] = [a, b].map(_ => _.artist.toLowerCase().replace(/^the\s+/, ''));
  return nameA.localeCompare(nameB);
});

样本

const recordCollection = [{
  "artist": "The Beatles",
  "title": "The Beatles",
  "year": "1968",
}, {
  "artist": "Led Zepplin",
  "title": "II",
  "year": "1969",
}];

recordCollection.sort((a, b) => {
  const [nameA, nameB] = [a, b].map(_ => _.artist.toLowerCase().replace(/^the\s+/, ''));
  return nameA.localeCompare(nameB);
});

console.log(recordCollection);

  • /^the\s+/将在字符串的开头捕获“ the”,后跟任意数量的空格,
  • String.localeCompare将比较字符串,并相应地返回负值,正值或0

注意:使用箭头语法和const时,如果您需要支持较旧的客户端/未使用Babel这样的工具,则可以轻松地切换回function() { ... }var