【问题标题】:How to add commas in between words in string in Javascript如何在Javascript中的字符串中的单词之间添加逗号
【发布时间】:2020-10-22 21:27:07
【问题描述】:

我正在尝试在括号中的名字和姓氏之间添加逗号。

//Input:

s = "Fred:Corwill;Wilfred:Corwill;Barney:Tornbull;Betty:Tornbull;Bjon:Tornbull;Raphael:Corwill;Alfred:Corwill";

//Expected output: "(CORWILL, ALFRED)(CORWILL, FRED)(CORWILL, RAPHAEL)(CORWILL, WILFRED)(TORNBULL, BARNEY)(TORNBULL, BETTY)(TORNBULL, BJON)"

我的代码当前输出的是什么:

(CORWILL ALFRED) (CORWILL FRED) (CORWILL RAPHAEL) (CORWILL WILFRED) (TORNBULL BARNEY) (TORNBULL BETTY) (TORNBULL BJON)

我尝试了多种方法,例如在重新分配 s(字符串)时更改字符在开头的替换方式,这样我就不会首先删除逗号,然后必须替换它们.. .但是当我这样做时,我拥有的正则表达式不再工作,我不知道为什么会这样。所以我试图找到另一个正则表达式来使用,这样我就可以解决这个问题,但这同样是一个痛苦,所以我决定坚持以这种方式解决它:试图找到一种在第一个之间找到逗号的方法,和括号中的姓氏。

完整问题和代码:

/*Could you make a program that 
    •   makes this string uppercase
    •   gives it sorted in alphabetical order by last name. 
When the last names are the same, sort them by first name. Last name and first name of a guest come in the result between parentheses separated by a comma.
*/

function meeting(s) {

  s = s.replace(/:/g, ", ").toUpperCase();

  //order alphabetically based on Last, then first name
 const semicolon = ';'
 let testArr = s.split(semicolon)
  testArr.sort(function compare(a, b) {
      var splitA = a.split(",");
      var splitB = b.split(",");
      var firstA = splitA[0]
      var firstB = splitB[0]
      var lastA = splitA[splitA.length - 1];
      var lastB = splitB[splitB.length - 1];

      if (lastA < lastB) return -1;
      if (lastA > lastB) return 1; 

      if (firstA < firstB) return -1; //sort first names alphabetically
      if (firstA > firstB) return 1; 
      return 0; //if they are equal
  })
  //print last names before first names with regex
let newArr = [];
for (let i = 0; i < testArr.length; i++) {
  let variable = (testArr[i].replace(/([\w ]+), ([\w ]+)/g, "$2 $1"))
  let comma = ","
  newArr.push(`(${variable})`)
  }
  
let finalStr;
finalStr = newArr.toString().replace(/[ ,.]/g, " ").toUpperCase();
// finalStr = finalStr.replace(/" "/g, ", ")
return finalStr
}

s = "Fred:Corwill;Wilfred:Corwill;Barney:Tornbull;Betty:Tornbull;Bjon:Tornbull;Raphael:Corwill;Alfred:Corwill";

console.log(meeting(s))

// expected result: "(CORWILL, ALFRED)(CORWILL, FRED)(CORWILL, RAPHAEL)(CORWILL, WILFRED)(TORNBULL, BARNEY)(TORNBULL, BETTY)(TORNBULL, BJON)"

任何帮助将不胜感激,我在这个问题上花了大约 5 个小时。我使用的正则表达式是用名字的位置(Fred Corwill)->(Corwill Fred)切换姓氏的位置。如果有一个 regex 对我来说不是你可以建议的我正在使用的那个,也许我也可以通过这种方式解决这个问题,到目前为止我所尝试的一切都没有工作我在这里使用的一个。

【问题讨论】:

  • 您根本不需要正则表达式。您可以使用split() 调用和字符串连接来完成所有操作。
  • 我可以使用 split() 来切换姓氏的位置和名字的位置吗? (弗雷德·科威尔)-->(科威尔·弗雷德)
  • 你知道,有些人不会只有两个名字
  • 是的,当然,这是一个很好的观点,但是对于这个问题,我只需要担心。

标签: javascript regex


【解决方案1】:

这看起来比实际需要的要复杂得多。通过;s 拆分后,将每个单独的元素以相反的顺序映射到其单词,然后加入:

const s = "Fred:Corwill;Wilfred:Corwill;Barney:Tornbull;Betty:Tornbull;Bjon:Tornbull;Raphael:Corwill;Alfred:Corwill";

const output = s
  .toUpperCase()
  .split(';')
  .sort((a, b) => {
    const [aFirst, aLast] = a.split(':');
    const [bFirst, bLast] = b.split(':');
    return aLast.localeCompare(bLast) ||  aFirst.localeCompare(bFirst);
  })
  .map((name) => {
    const [first, last] = name.split(':');
    return `(${last}, ${first})`;
  })
  .join('');
console.log(output);

【讨论】:

  • 这是对名称进行排序的简洁方法。 localeCompare“返回一个数字,指示引用字符串是在排序顺序之前、之后还是与给定字符串相同”。如果姓氏不同,它将对姓氏在前的人进行排序(返回 1 或 -1)。否则,localeCompare 将返回 0,因此它将继续与名字进行相同的比较。
  • 哦,忘了逗号 - 在返回映射字符串时输入 ,
  • 好的,这里没有逗号,所以我添加了它们,最终代码有效:function meeting(s) { const output = s .toUpperCase() .split(';') .sort((a, b) =&gt; { const [aFirst, aLast] = a.split(':'); const [bFirst, bLast] = b.split(':'); return aLast.localeCompare(bLast) || aFirst.localeCompare(bFirst); }) .map((name) =&gt; { const [first, last] = name.split(':'); return (${last}, ${first}); }) .join(''); return output; }
  • 如果您将结果复制到 sn-p 中,您会发现它与您的 //Expected output: 在问题中所说的完全匹配 - 这不是您想要的吗?
  • 快速提问...当您使用const [aFirst, aLast]const [first, last] 时,您是否同时声明了这两个变量? (我从未见过这种语法)它们也是字符串是吗?是的,这个解决方案现在有效,以前没有(逗号不存在,我添加了它,不知道这是怎么发生的),我会接受它。谢谢!
【解决方案2】:

这就是你需要的:

const str = 'Fred:Corwill;Wilfred:Corwill;Barney:Tornbull;Betty:Tornbull;Bjon:Tornbull;Raphael:Corwill;Alfred:Corwill';

function formatString(string) {
  const modifiedString = string.toUpperCase().replace(/(\w+):(\w+)/g, '($2, $1)');
  const sortedString = modifiedString.split(';').sort().join('');
  
  return sortedString;
}

console.log(formatString(str))

【讨论】:

    【解决方案3】:

    在地图和排序中使用拆分

    var s = "Fred:Corwill;Wilfred:Corwill;Barney:Tornbull;Betty:Tornbull;Bjon:Tornbull;Raphael:Corwill;Alfred:Corwill";
    
    var res = s.split(/;/) // split into people
      .map(x => x.split(/:/).reverse()) // split names, put last first
      .sort((a, b) => a[0] === b[0] ? a[1].localeCompare(b[1]) : a[0].localeCompare(b[0])) // sort by last name, first name
      .map(x => `(${x.join(', ')})`) // create the new format
      .join(' ') // join the array back into a string
    console.log(res);

    【讨论】:

    • 老实说,我正试图弄清楚这如何适合我的其余代码,所以它们仍然可以按字母顺序排列。当我将它作为最后一行插入时,就在返回之前,它消除了字母顺序和正则表达式的影响。关于这适合哪里的任何线索? /:
    • 但是这个更新的解决方案并没有考虑到他们必须按姓氏的字母顺序,然后是名字的字母/:仍在试图弄清楚。
    • @grimreaper 有一个错字导致它按姓氏排序两次。复制粘贴失败.....哎呀
    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 2017-12-02
    • 2023-02-17
    相关资源
    最近更新 更多