获取分割字符串数组的最后一个元素

273

我需要获取由多个分隔符拆分后的数组的最后一个元素。这些分隔符是逗号和空格。如果没有分隔符,它应该返回原始字符串。

如果字符串是“how,are you doing, today?”,那么应该返回“today?”。

如果输入是“hello”,输出应该是“hello”。

如何在JavaScript中实现?

11个回答

1016

什么事情都有一行代码可以解决。 :)

var output = input.split(/[, ]+/).pop();

8
问题在于pop()函数会将数组中的元素删除,从而改变数组。 - slashwhatever
82
没问题,因为数组是通过 split 调用创建的,所以它不会被保留。从数组中弹出项目并不会改变原始字符串。 - Guffa
1
很棒,一次性完成所有操作,无需设置中间变量来设置数组...不错。 - virtualeyes
2
@VitorGuerreiro:是的,你可以使用 slice 方法:var output = input.split(/[, ]+/).slice(-2); - Guffa
2
@MarioLevrero:这是一个量词,与量词{1,}的含义相同,即[, ]+匹配集合中一个或多个字符(逗号和空格)。当您想要从字符串中获取所有单词时,它非常有用,但当您只想要最后一个单词时,它不会产生任何功能上的差异,它只会减少开销,因为数组中的字符串将更少。 - Guffa
显示剩余2条评论

161

const str = "hello,how,are,you,today?"
const pieces = str.split(/[\s,]+/)
const last = pieces[pieces.length - 1]

console.log({last})

此时,pieces是一个数组,而pieces.length则包含了该数组的大小,因此要获取该数组的最后一个元素,您可以检查 pieces[pieces.length-1]。如果没有逗号或空格,它将简单地输出给定的字符串。

alert(pieces[pieces.length-1]); // alerts "today?"

92
你还可以使用 pieces.pop() 来获取你的数组中的最后一个元素。 - Trent
5
有没有一种方法可以在不存储变量的情况下使用“this”来引用str.split()? - Tanner
5
将字符串按空格或逗号拆分成数组,然后取出最后一个元素赋值给变量last。 - zanderwar

108
var item = "one,two,three";
var lastItem = item.split(",").pop();
console.log(lastItem); // three

10
我认为pop()函数不需要传入参数。 - Grace Huang
@GraceShao:没错。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/pop - aymericbeaumet
6
一般而言,.split(',').pop() 可以用来获取逗号分隔字符串的最后一个元素。我只是想说这个因为我曾被 Guffa 给出的令人惊叹的答案误导了,因为我不需要正则表达式,所以忽略了它,认为这个技巧就在那里! :P - cregox

42

最好的一个,也是我最喜欢的方法,使用 splitslice

const str = "hello, how are you today?"
const last = str.split(' ').slice(-1)[0]
console.log({last})

另一个方法是使用split然后将最后一个弹出pop.

const str = "hello, how are you today?"
const last = str.split(' ').pop()
console.log({last})


2
当然。这是一个好答案,因为它不会改变原来的+1。 - technoY2K
2
使用 .pop() 在切片后仍然是一种很好的便利,因为访问方法返回一个新的数组,所以不会发生任何变异。 - 4UmNinja

34

你也可以考虑将数组翻转并取第一个元素。这样你就不需要知道长度,但它并没有带来实质性的好处,而且缺点是在处理大数组时反转操作可能会更慢:

array1.split(",").reverse()[0]

虽然很容易,但它也修改了所讨论的原始数组。这可能是一个问题,也可能不是。

参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse

也许您想使用这个:

array1.split(",").pop()

4
.pop() 方法是目前为止我见过的最好的答案。这就是它被创建的原因! - Nicholas Porter
1
我强烈建议不要使用reverse(),因为在大型数组上反转操作会非常耗费资源。如果你不关心变异,可以直接使用pop(),否则使用slice(-1)[0]。 - wortwart
这会增加时间复杂度,因为你需要额外的循环来反转数组。 - jithil

5
这种方法易于理解并且非常简短。
const output = input.split(',').pop().split(' ').pop();

4

at() 方法接受一个整数值并返回该索引处的项目,允许使用正数和负数。负数从数组中的最后一个项目开始计算。

const str = "how,are you doing, today?";
const last = str.split(/[\s,]+/).at(-1);
console.log({last});

文档链接:Array.prototype.at()


4

获取最后一个元素有多种方法

let input='one,two,three,four';

let output1 = input.split(',').pop();
console.log('output1 =',output1);

let split = input.split(',');
let output2 = split[split.length-1];
console.log('output2=',output2);

let output3 = input.split(',').reverse()[0];
console.log('output3=',output3);

let output4 = input.split(',').slice(-1)[0];
console.log('output4=',output4);


3

如果你不想构建一个数组...

var str = "how,are you doing, today?";
var res = str.replace(/(.*)([, ])([^, ]*$)/,"$3");

The breakdown in english is:

/(anything)(any separator once)(anything that isn't a separator 0 or more times)/

replace命令表示用最后一个分隔符后面的内容替换整个字符串。

因此,您可以看到这可以被普遍应用。请注意,原始字符串不会被修改。


0
var title = 'fdfdsg dsgdfh dgdh dsgdh tyu hjuk yjuk uyk hjg fhjg hjj tytutdfsf sdgsdg dsfsdgvf dfgfdhdn dfgilkj,n, jhk jsu wheiu sjldsf dfdsf hfdkdjf dfhdfkd hsfd ,dsfk dfjdf ,yier djsgyi kds';
var shortText = $.trim(title).substring(1000, 150).split(" ").slice(0, -1).join(" ") + "...More >>";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接