在JavaScript中处理数组中的最后一项

时间:2014-12-27 22:10:17

标签: javascript arrays

我最近开始学习JavaScript,但我遇到了问题。我试着搜索以前的问题,但我没有找到类似的问题。提示符要求我按姓氏,名字按字母顺序重新排序列表。

我的问题涉及数组中的最后一项。由于最后一项不需要逗号,因此console.log上的输出会导致数组中的姓氏没有逗号分隔姓氏和名字。

我认为解决方案是在nameQueue.reverse和nameQueue.join之间放置一个if语句。我尝试查找正确的RegExp来查找逗号并返回true或false,但这实在是太过分了。

有没有人为此找到一个简单的解决方案?

var moonWalkers = [
  "Neil Armstrong",
  "Buzz Aldrin",
  "Pete Conrad",
  "Alan Bean",
  "Alan Shepard",
  "Edgar Mitchell",
  "David Scott",
  "James Irwin",
  "John Young",
  "Charles Duke",
  "Eugene Cernan",
  "Harrison Schmitt"
];

function alphabetizer(names) {
    // Your code goes here!
    var list = names.join(", ");
    list = list.split(" ");
    var reorderName = [];
    for (i=0; i < names.length; i++){
        var nameQueue = list.splice(0,2);
        nameQueue = nameQueue.reverse();
        nameQueue = nameQueue.join(" ");
        reorderName = reorderName.concat(nameQueue);
        reorderName.sort();
    }
        return reorderName;

}

// Try logging your results to test your code!
console.log(alphabetizer(moonWalkers));

5 个答案:

答案 0 :(得分:1)

我不会试图挽救你的解决方案并注入失踪的,,因为那不是你应该如何解决这个问题。这是一个死胡同的解决方案,它过于复杂,并且在非常有限的输入子集上工作。它需要完全废弃并在任何真实场景中立即重写,因为加入一个包含100,000个名字的数组数组来生成一个字符串只是为了立即用新的分隔符打破它将是非常站不住脚的,因为你已经需要排序的数组。

解决此问题的正确方法是保持数组完整,并改变各个元素。然后,对整个列表进行排序:

var names = [
  "Neil Armstrong",
  "Buzz Aldrin",
  "Pete Conrad",
  "Alan Bean",
  "Alan Shepard",
  "Edgar Mitchell",
  "David Scott",
  "James Irwin",
  "John Young",
  "Charles Duke",
  "Eugene Cernan",
  "Harrison Schmitt"
];

// For each element, split it, reverse it, join it,
// producing [ 'Armstrong, Neil', 'Aldrin, Buzz', etc ]
names = names.map(function (n) { return n.split(' ').reverse().join(', ') });

// Simply sort the resulting array, and you're done
console.log(names.sort());

我的解决方案可能在一个新名称时失败,例如&#34; Vincent van Gogh&#34;介绍。不同之处在于我的解决方案是一行代码,可以轻松修改以适应名称的特定规则,或者不经过深思熟虑就抛出并重写。将数组变为简单sort ed状态的基础算法将始终由任何替代我的解决方案保留;关键是我没有编写排序算法,我只是编写了知道如何改变名称的部分。

答案 1 :(得分:0)

一种简单但不干净的方法是在重新排序之前将“,”添加到数组的最后一个元素。

答案 2 :(得分:0)

你基本上做的是在每个字符串中添加一个逗号,并加入/分割。我会添加一个&#34; custom&#34;逗号到字符串的末尾,就在这里:

var list = names.join(", ");
list += ",";
list = list.split(" ");

另外,我避免使用相同的变量来保存不同的数据类型(列表)。即使Javascript很灵活并且允许你这样做,它也不漂亮并且会导致混乱。

答案 3 :(得分:0)

解决问题的另一种方法。我将字符串分割到最后一个空格。然后重新排列值并将它们放回复制的数组中。最后让sort做它的工作。这会导致Vincent van Gogh问题。

var reorderName = moonWalkers.slice(0); //copy the array

for (var i=0; i < reorderName.length; ++i){
    var lastName = reorderName[i].substr(reorderName[i].lastIndexOf(" "));
    var name = reorderName[i].substr(0, reorderName[i].lastIndexOf(" "));

    //output is: Gogh, Vincent van
    var fullName = lastName + ", " + name; //append that comma!
    reorderName[i] = fullName;

    reorderName.sort();
}

return reorderName;

答案 4 :(得分:0)

另一种方法是只需编写一个与最后一个单词进行比较的自定义排序函数。这假设最后一个词是姓氏,这是一个很大的假设,但它并没有改变原始的数组元素。 (您的问题并没有明确表示有必要将FORENAME LASTNAME转换为LASTNAME, FORENAME,只是您希望数组按姓氏排序。

var getLastWord = (function() {
  var lastWord = /\w+$/;

  // Return a function which returns the last word in a string
  return function(str) {
    return lastWord.exec(str)[0];
  };
})();

// Comparison function by last word in string
var compareByLastWord = function(a, b) {
  return getLastWord(a) > getLastWord(b);
};

moonWalkers.sort(compareByLastWord);