替换最后","用" &安培; "

时间:2018-04-17 16:22:00

标签: javascript arrays regex replace

我正在尝试执行以下任务

Task Codewars

这是我的解决方案

function list(names){
  return names.map(x => x.name).join(',').replace("," , "&");
}

我想用& 替换最后的逗号

我在互联网上找到了这个解决方案替换(/,(?!。*,)/,"&")但是,它对我不起作用我不明白。

是否可以使用替换方法以不同的方式解决此问题?

3 个答案:

答案 0 :(得分:2)

它几乎可以工作,只有你必须删除正则表达式中的额外空格,因为它有意义。

更改

replace(/, (?!.*, )/ , "&")
..........^......^.........
whitespaces

.replace(/,(?!.*,)/, "&")

此部分,(?!.*,)与逗号匹配,并使用negative lookahead (?!.*,断言后面的内容不包含逗号。这将确保最后一个逗号匹配。

由于SourceOverflow指出了示例数据的这一意义,但在名称本身中有逗号时无效。



function list(names){
    return names.map(x => x.name).join(',').replace(/,(?!.*,)/ , "&");
}
console.log(list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'} ]));




这将导致:

  

巴特,莉莎&安培;玛吉

答案 1 :(得分:1)

你不需要正则表达式。您可以简单地对数组进行切片以包含除最后一个元素以外的所有元素,然后将其加到,上,并附加最后一项将其与&分开,如下面的代码段所示。



var myNames = [{name:"Smith"},{name:"John"},{name:"Jack"},{name:"Emma"}]

console.log(list(myNames))

function list(names){
  var n = names.map(x => x.name)
  return n.slice(0,-1).join(',') + '&' + n.slice(-1);
}




如果只有1个名称的可能性,您可以使用以下内容确保结果不会返回&name之类的内容:

return (n.length > 1 ? n.slice(0,-1).join(',') + '&' : '') + n.slice(-1);

答案 2 :(得分:1)

你可以这样做:



function list(names) {
  return names.map(x => x.name).join(', ').replace(/,([^,]*)$/, ' &$1');
}

console.log(list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'} ]));
// returns 'Bart, Lisa & Maggie'

console.log(list([ {name: 'Bart'}, {name: 'Lisa'} ]));
// returns 'Bart & Lisa'

console.log(list([ {name: 'Bart'} ]));
// returns 'Bart'

console.log(list([]));
// returns ''