在 JavaScript 中处理数组中的最后一项
Dealing With the Last Item in Array in JavaScript
我最近开始学习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);
- 显示数字,然后每5秒随机更改一次(javascript)
- 使函数只运行一次(Javascript)
- 在 JavaScript 中处理数组中的最后一项
- JavaScript for 循环只返回数组中的最后一项
- 当最后一项在javascript中的旋转木马中可见时,如何禁用链接/按钮等
- 只显示/隐藏一项javascript
- Javascript:如何在复选框中只选中一项
- JavaScript splice()方法如果splice()的第一个参数为-1,则删除数组的最后一项
- Javascript:从对象中移除一项
- 用Javascript中的另一项替换数组中的一项
- Javascript Canvas一项闪烁
- Javascript只设置数组中最后一项的属性
- 检查javascript数组中的最后一项
- 选择数组javascript中的最后一项
- Javascript forEach()通过数组:如何获取上一项和下一项
- 总是获取数组中的最后一项,我需要 JavaScript 闭包吗?
- Javascript访问数组中的一项
- Javascript映射数组最后一项
- 比较二维数组和一维数组并删除匹配项(JavaScript)
- Javascript代码,用于从字符串中删除最后一项(如果它存在)