简体   繁体   English

将名字和姓氏翻转为姓氏名字

[英]Flip first name and last name to last name first name

I'm trying to swap the first names and last names of from textarea我正在尝试从 textarea 交换名字和姓氏

Input: John Doe输入: John Doe

Jane Doe简·多伊

Joe Doe乔·多伊

Joan Doe琼·多伊

Jenny van Doe珍妮·范·多伊

Desired output: Doe, John所需的 output: Doe,John

Doe, Jane能源部,简

Doe, Joe能源部,乔

Doe, Joan多伊,琼

van Doe, Jenny范多伊,珍妮

But getting: Doe Jane Doe Joe Doe Joan Doe Jenny van Doe, John但得到: Doe Jane Doe Joe Doe Joan Doe Jenny van Doe, John

The logic is pretty simple, take the first string as first name and the rest as last name, if there are middename it will also be taken in as last name separated by a comma.逻辑很简单,取第一个字符串为名字,rest 为姓氏,如果有中间名也取为姓氏,用逗号隔开。

It is working with this code but only for a one liner.它正在使用此代码,但仅适用于一个班轮。 Hence if it's a list names from a textarea it will take first string as first name and assign the rest of the names to last name.因此,如果它是来自 textarea 的列表名称,它将把第一个字符串作为名字并将名称的 rest 分配给姓氏。

 var splitName = document.getElementById("splitName"); splitName.onclick = function() { var fullname = document.getElementById("fullName").value; console.log(fullname); var spaceIndex = fullname.indexOf(" "); var firstname; var lastname; if (spaceIndex == -1) { lastname = fullname; lastname = ""; } else { var firstname = fullname.substring(0, spaceIndex); var lastname = fullname.substr(spaceIndex + 1); } document.getElementById("result").innerHTML = lastname + ", " + firstname; };
 <div> <textarea cols="20" rows="5" id="fullName"></textarea> </div> <div id="splitName" class="hwbutton">Reverse</div> <div id="result"></div>

This is how I would do it.我就是这样做的。

 const rearrangeName = (name) => { // convert name string into array, split by spaces name = name.split(' ') // get first name const firstName = name[0] // reconnect the rest of the name by spaces // trim is just to remove trailing spaces const restOfName = name.slice(1).join(' ').trim() // return rearranged name, separated by comma return restOfName + ', ' + firstName } // Above is the main function. This following is just if you want to do // something with the DOM. const textArea = document.querySelector('textarea') const button = document.querySelector('button') const output = document.querySelector('.output') button.addEventListener('click', e => { // two \n's because that's how they're separated in textarea const values = textArea.value.split(/\n\n/g) // I'm just clearing out the old values if the user wants to try again. output.innerHTML = '' for (let i = 0; i < values.length; i++) { output.innerHTML += rearrangeName(values[i]) + '<br>' } })
 <textarea> John Doe Jane Doe Joe Doe Joan Doe Jenny van Doe </textarea> <button>Print formatted name to output</button> <div class="output"></div>

You can use split() to separate the lines and then use a loop.您可以使用split()分隔行,然后使用循环。

 var splitName = document.getElementById("splitName"); splitName.onclick = function() { document.getElementById("result").innerHTML = ''; const value = document.getElementById("fullName").value; value.split('\n').forEach(fullname => { var spaceIndex = fullname.indexOf(" "); var firstname; var lastname; if (spaceIndex == -1) { lastname = fullname; lastname = ""; } else { firstname = fullname.substring(0, spaceIndex); lastname = fullname.substr(spaceIndex + 1); } document.getElementById("result").innerHTML += lastname + ", " + firstname + "<br>"; }); };
 <div> <textarea cols="20" rows="5" id="fullName">Jane Doe Joe Doe Joan Doe Jenny van Doe</textarea> </div> <div id="splitName" class="hwbutton">Reverse</div> <div id="result"></div>

Here is my version这是我的版本

 const splitName = document.getElementById("splitName"); splitName.addEventListener("click", function() { var fullnames = document.getElementById("fullName").value.split("\n"); document.getElementById("result").innerHTML = fullnames.map( name => { const [first, ...last] = name.trim().split(/ /); return `${last.join(" ")}, ${first}` }).join("<br>") });
 <div> <textarea cols="20" rows="5" id="fullName">John Doe Jane Doe Joe Doe Joan Doe Jenny van Doe</textarea> </div> <div id="splitName" class="hwbutton">Reverse</div> <div id="result"></div>

It's because you need to split the text on the carriage return.这是因为您需要在回车符上split文本。 That way you get an array you can then iterate over.这样你就可以得到一个数组,然后可以迭代。 You can use a for-loop , but I updated your code a little using map , and a simple regular expression.您可以使用for-loop ,但我使用map和一个简单的正则表达式稍微更新了您的代码。

 // Cache the elements const splitName = document.getElementById('splitName'); const fullname = document.getElementById('fullName'); // We have a regex that finds first name match, and // then a match for the last name const regex = /([a-zA-Z]+) ([a-zA-Z ]+){1,}/; // -------first name ^, last name --^ splitName.addEventListener('click', handleClick, false); function handleClick() { // So now we need some names. We grab the value, trim off // any spaces, and then split the names into an array const names = fullname.value.trim().split('\n'); // Now, using `map` we can iterate over the array of names // and find matches. `match` also returns an array. The // first element is always the complete match, and the other // elements contain the matches we specified in our regex const result = names.map(name => { const match = name.match(regex); // So we ignore the first match, and the grab the next match // (first name), and then everything else (last name) const [, first, ...last ] = match; // And then return the new string return `${last}, ${first}`; }); console.log(result); };
 <div> <textarea cols="20" rows="5" id="fullName"> John Doe Jane Doe Joe Doe Joan Doe Jenny van Doe </textarea> </div> <div id="splitName" class="hwbutton">Reverse</div> <div id="result"></div>

Additional documentation附加文件

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM