Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中从数组中的每个字符串中选择最后一个单词?_Javascript - Fatal编程技术网

如何在JavaScript中从数组中的每个字符串中选择最后一个单词?

如何在JavaScript中从数组中的每个字符串中选择最后一个单词?,javascript,Javascript,假设我有一个字符串列表,如: foo = ["asdfas ad sfa", "asdfa dfas fasd", "adf adfasd sdfasf adfdf"]; 现在,我需要一个映射,将此数组映射到每个字符串最后一个单词的列表中: bar = ["ad", "dfas", "sdfasf"]; 我知道我可以通过使用regex/(\w+)\s\w+$/找到它们,但是我如何使用找到的结果来执行映射呢?试试这个。从字符串中获取最后一个字符 试试这个: bar = foo.map(func

假设我有一个字符串列表,如:

foo = ["asdfas ad sfa", "asdfa dfas fasd", "adf adfasd sdfasf adfdf"];
现在,我需要一个映射,将此数组映射到每个字符串最后一个单词的列表中:

bar = ["ad", "dfas", "sdfasf"];

我知道我可以通过使用regex
/(\w+)\s\w+$/
找到它们,但是我如何使用找到的结果来执行映射呢?

试试这个。从字符串中获取最后一个字符

试试这个:

bar = foo.map(function(el){
   return el.match(/^.*?(\w+)\s\w+$/)[1]; 
});
bar = foo.map(function(d){return d.replace(/.*?(\w+)\s\w+$/,"$1")});
或者使用jquery

bar = $.map(foo, function(el, i){
   return el.match(/^.*?(\w+)\s\w+$/)[1]; 
});

试试这个。我使用了JavaScript 1.8数组
reduce
方法

[
 "asdfas ad sfa", 
 "asdfa dfas fasd", 
 "adf adfasd sdfasf adfdf"
].reduce( function ( m , r ){
    var splitted = r.split(/\W+/g);
    if ( splitted.length > 1 ){
        m.push( splitted[splitted.length-2] );
    }
    return m;
},[]);

没错,地图是您需要的

foo = ["asdfas ad sfa", "asdfa dfas", "adf adfasd sdfasf adfdf"];

foo.map(function(str) {
    var words = str.split(" "), total = words.length;
    if (total>2) this.push(words[total-2]);;
}, bar=[]);
alert(bar);
又忘了

编辑:正如@jcsanyi提到的,我以前的代码在字符串包含少于3个单词时返回空元素,所以我找到了一个解决方案并再次修改了它

foo仍然是全局的(它不是bug),第二个元素现在只有两个单词需要检查


我想用正则表达式替换

bar = foo.map(function(d){return d.replace(/^.*\s(\w+)\s\w+$/,"$1")});
更新:在阅读了下面的评论后,我认为这一条可能会更好:

bar = foo.map(function(d){return d.match(/(\w+)\s\w+$/)[1]});
当没有满足我需求的第二个最后一句话时,它会抛出错误。当然,如果您希望在找不到第二个最后一个单词时保持字符串不变,请尝试以下操作:

bar = foo.map(function(d){return d.replace(/.*?(\w+)\s\w+$/,"$1")});


你的意思是像
jQuery.map()
?谢谢。所以
bar=foo.map(函数(d){return d.replace(/.*\s(\w+)\s\w+$/,“$1”)}
,这就是你们要做的吗?我想我会的,是的。正则表达式的问题是,如果少于2个单词,它将保持一个单词不变。这可能是您想要的,但这里确实有三种可能的行为(返回
'
、从数组中删除或保持不变),我们不知道您在这种情况下期望的是什么。为什么要使用
减少
而不是
映射
?这也会返回第二个词,而不是最后一个词。@jcsanyi假设
[“asdfas ad sfa”、“asdfa dfas fasd”、“adf adfasd sdfasf adfdf”、“一两”、“onlyone”]
类似数组..我喜欢ommit
onlyone
case@jcsanyiuff..我快速阅读了这个问题..我把它更正到倒数第二位..感谢您注意到它的意义(重新使用
reduce
),但是OP没有定义他想要的行为,我想这至少应该在你的回答中得到一些评论。不是我,但我怀疑这是因为这个问题没有提到任何关于jQuery的内容,而你的回答假设它是可用的,甚至没有提过它。哦,我的错,加上jQuery。谢谢。你和rab都得到了正确的结果。但我仍然认为我的答案更短,更容易概括,因为我的答案只涉及正则表达式。你应该检查一下单词。length@trVoldemort不客气,你的答案很短,但我认为不容易理解。无论如何,luk2302是第一个建议使用的map@SubirKumarSao你说得对(尽管他没有要求这样做)、更新的代码和演示……如果您不返回任何内容,会发生什么?这是否意味着最终数组将包含一个空元素?如果少于两个(或三个)字,这可能无法按预期工作(取决于预期内容)。至少,您应该考虑到最后的第二个工作也是第一个工作的可能性,并允许在它之前使用
(\s|^)
。我建议使用以下正则表达式:
/(^ |\s)(\w+)\s+\w+\s*$/
,并用
“$2替换“
。它将处理2字字符串,并允许意外插入的额外空格。请记住,1字字符串将保持不变。@jcsanyi
如何返回d.split(/\W+/g).slice(-2).shift()
?@rab这是另一种可能的解决方案,只要考虑到边缘情况-如果字符串末尾有空格会发生什么情况(不查找它,我不知道在这种情况下,
split()
),如果少于2个元素会发生什么情况?@jcsanyi在控制台
[“asdfas ad sfa”,“asdfa dfas fasd”、“adf adfasd sdfmmasf adfdf”、“一两”、“onlyone”和“].map(函数(d){返回d.split(/\W+/g.slice(-2.shift()));
这没有回答问题。请重新阅读问题。