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

Dealing With the Last Item in Array in JavaScript

本文关键字:一项 JavaScript 处理 数组 最后      更新时间:2023-09-26

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

我的问题涉及数组中的最后一项。由于最后一项不需要逗号,因此控制台上的输出.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));

我不会尝试挽救您的解决方案并注入缺失的,,因为这真的不是您应该解决此问题的方式。这是一个死胡同的解决方案,它过于复杂,并且适用于极其有限的输入子集。在任何现实世界中,它都需要完全报废并几乎立即重写,因为加入一个包含 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());

当引入"文森特梵高"等新名字时,我的解决方案也可能失败。不同之处在于,我的解决方案是一行代码,可以很容易地修改以适应名称的特定规则,或者不假思索地抛弃和重写。将数组突变为可以简单地sort的状态的底层算法将始终被任何取代我的解决方案保留;关键是我不是在写排序算法,我只是在写知道如何改变名称的部分。

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

你基本上要做的是在每个字符串上附加一个逗号,并加入/拆分。我会在字符串的末尾添加一个"自定义"逗号,就在这里:

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

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

解决问题的另一种方法。我在最后一个空格上拆分字符串。然后重新排列值并将它们放回复制的数组中。最后让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;
另一种

方法是编写一个与最后一个单词进行比较的自定义排序函数。这假设最后一个单词是姓氏,这是一个很大的假设,但它不会改变原始数组元素。(您的问题并没有明确说明有必要将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);