简体   繁体   English

使用 JavaScript 拆分名字和姓氏

[英]Split First name and Last name using JavaScript

I have a user with the name Paul Steve Panakkal .我有一个名为Paul Steve Panakkal的用户。 It's a long name it won't fit to the div container.这是一个长名称,它不适合 div 容器。 So is there anyway to split first name and last name from it using JavaScript or jQuery?那么无论如何使用 JavaScript 或 jQuery 将名字和姓氏从中分离出来吗?

The name is got from PHP into a variable in JavaScript.该名称是从 PHP 获取到 JavaScript 中的变量中的。 This is then splitted using JS.然后使用 JS 对其进行拆分。

You should use the String.prototype.split() method:您应该使用String.prototype.split()方法:

'Paul Steve Panakkal'.split(' '); // returns ["Paul", "Steve", "Panakkal"]

You can use it this way:你可以这样使用它:

'Paul Steve Panakkal'.split(' ').slice(0, -1).join(' '); // returns "Paul Steve"
'Paul Steve Panakkal'.split(' ').slice(-1).join(' '); // returns "Panakkal"

So in common:所以共同点:

var firstName = fullName.split(' ').slice(0, -1).join(' ');
var lastName = fullName.split(' ').slice(-1).join(' ');

Yes:是的:

var fullName = "Paul Steve Panakkal".split(' '),
    firstName = fullName[0],
    lastName = fullName[fullName.length - 1];

References:参考:

In Spanish it can be tricky because you may have a second optional name and even complex surnames like "del Bosque" or "de la Hoya", vowels with accent marks and the ñ .在西班牙语中,这可能很棘手,因为您可能有第二个可选名称,甚至是复杂的姓氏,如“del Bosque”或“de la Hoya”、带有重音符号的元音和ñ The following javascript is capabable of parsing a full spanish name, having in count you are writting it respecting the upper and lower cases.以下 javascript 能够解析完整的西班牙名称,因为您在编写它时会考虑大写和小写。 It will return a json giving you它会返回一个json给你

  1. name : 1 or 2 main names name : 1 或 2 个主要名称
  2. lastName : the main lastname lastName : 主要姓氏
  3. secondLastName : The second lastname secondLastName :第二个姓氏

The code is:代码是:

function parseName(input) {
        var fullName = input || "";
        var result = {};

        if (fullName.length > 0) {
            var nameTokens = fullName.match(/[A-ZÁ-ÚÑÜ][a-zá-úñü]+|([aeodlsz]+\s+)+[A-ZÁ-ÚÑÜ][a-zá-úñü]+/g) || [];

            if (nameTokens.length > 3) {
                result.name = nameTokens.slice(0, 2).join(' ');
            } else {
                result.name = nameTokens.slice(0, 1).join(' ');
            }

            if (nameTokens.length > 2) {
                result.lastName = nameTokens.slice(-2, -1).join(' ');
                result.secondLastName = nameTokens.slice(-1).join(' ');
            } else {
                result.lastName = nameTokens.slice(-1).join(' ');
                result.secondLastName = "";
            }
        }

        return result;
}

The surnames are required if you are going to specify a second name.如果您要指定第二个名字,则姓氏是必需的。 Try it out with:试试看:

  • Vicente Hernández Planes维森特·埃尔南德斯飞机
  • Oscar de la Hoya奥斯卡·德拉霍亚
  • José Julian Martí Pérez何塞·朱利安·马蒂·佩雷斯
  • Manuel de Céspedes del Castillo曼努埃尔·德·塞斯佩德斯·德尔·卡斯蒂略
  • Calixto García Íñiguez卡利斯托·加西亚·伊尼格斯

Even try out a complex one like甚至尝试一个复杂的,比如

  • María de la Caridad del Bosque y Loynáz María de la Caridad del Bosque y Loynáz

Comment your experiences with it.评论你的经历。

我认为,是时候开始使用正则表达式了 :)

"Paul Steve Panakkal".split(/(\s).+\s/).join("") // "Paul Panakkal"

The most common solution, where we always take the first word for the first name and the rest for the last name:最常见的解决方案,我们总是将第一个单词作为名字,其余的作为姓氏:

 const splitName = (name = '') => { const [firstName, ...lastName] = name.split(' ').filter(Boolean); return { firstName: firstName, lastName: lastName.join(' ') } } console.log(splitName('Jon Snow')); console.log(splitName(' Jon ')); console.log(splitName(' Jon The White Wolf '));

Extended version of Speransky Danil's answer which handles the case where the supplied string has only one word in it. Speransky Danil 的答案的扩展版本,它处理提供的字符串中只有一个单词的情况。

/**
 * Gets the first name, technically gets all words leading up to the last
 * Example: "Blake Robertson" --> "Blake"
 * Example: "Blake Andrew Robertson" --> "Blake Andrew"
 * Example: "Blake" --> "Blake"
 * @param str
 * @returns {*}
 */
exports.getFirstName = function(str) {
    var arr = str.split(' ');
    if( arr.length === 1 ) {
        return arr[0];
    }
    return arr.slice(0, -1).join(' '); // returns "Paul Steve"
}

/**
 * Gets the last name (e.g. the last word in the supplied string)
 * Example: "Blake Robertson" --> "Robertson"
 * Example: "Blake Andrew Robertson" --> "Robertson"
 * Example: "Blake" --> "<None>"
 * @param str
 * @param {string} [ifNone] optional default value if there is not last name, defaults to "<None>"
 * @returns {string}
 */
exports.getLastName = function(str, ifNone) {
    var arr = str.split(' ');
    if(arr.length === 1) {
        return ifNone || "<None>";
    }
    return arr.slice(-1).join(' ');
}

I tried below code and it works cool for me我尝试了下面的代码,它对我来说很酷

var full_name = 'xyz abc pqr';
var name = full_name.split(' ');
var first_name = name[0];
var last_name = full_name.substring(name[0].length.trim());

In above example:在上面的例子中:

(1) (1)

If full_name = 'xyz abc pqr';
first_name = "xyz";
last_name = "abc pqr";

(2) (2)

If `full_name = "abc"`:
Then first_name = "abc";
and last_name = "";

A comenter said What if want first name to be "Paul" and last name "Steve Panakkal"一位评论者说如果想要名字是“保罗”而姓氏是“史蒂夫·帕纳卡尔”怎么办?

 var name = "Paul Steve Panakkal" // try "Paul", "Paul Steve" var first_name = name.split(' ')[0] var last_name = name.substring(first_name.length).trim() console.log(first_name) console.log(last_name)

if you assume the last word is the last name and a single word name is also a last name then ...如果您假设最后一个单词是姓氏并且单个单词名称也是姓氏,那么...

var items = theName.split(' '),
    lastName = items[items.length-1],
    firstName = "";

for (var i = 0; i < items.length - 1; i++) {
   if (i > 0) {
      firstName += ' ';
   }
   firstName += items[i];
}

Watch out for edge-cases like only a first name being provided or two or more spaces being entered.注意边缘情况,例如仅提供名字或输入两个或多个空格。 If you only want to parse out the first and last name, this will do the trick (full name should always contain at least 1 character to avoid first_name being set to an empty string):如果您只想解析名字和姓氏,这将解决问题(全名应始终包含至少 1 个字符以避免将 first_name 设置为空字符串):

var full_name_split = "Paul Steve Panakkal".split(" ");
var first_name = full_name_split[0];
var last_name = full_name_split.length > 1 ? full_name_split[full_name_split.length - 1] : null;

There are many ways to Archive this.有很多方法可以存档这个。

I think the easiest way is to split and pop the last name.我认为最简单的方法是拆分并弹出姓氏。

 let fullname = 'Paul Steve Panakkal'; // from php let tmpArray = fullname.split(' '); //split the name to an array const lastname = tmpArray.pop(); // pop the last element of the aray and store it in "lastname" variable const firstname = tmpArray.join(' '); // join the array to make first and middlename and store it in "firstname" variale console.log("firstname:", firstname) console.log("lastname:", lastname)

Use this code:使用此代码:

You'll need to change the line: splitFullName("firstName","lastName","fullName");您需要更改行: splitFullName("firstName","lastName","fullName"); and make sure it includes the right field IDs from your form.并确保它包含表单中正确的字段 ID。


function splitFullName(a,b,c){
    String.prototype.capitalize = function(){
        return this.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } );
    };
    document.getElementById(c).oninput=function(){
        fullName = document.getElementById(c).value;
        if((fullName.match(/ /g) || []).length ===0 || fullName.substring(fullName.indexOf(" ")+1,fullName.length) === ""){
            first = fullName.capitalize();;
            last = "null";
        }else if(fullName.substring(0,fullName.indexOf(" ")).indexOf(".")>-1){
            first = fullName.substring(0,fullName.indexOf(" ")).capitalize() + " " + fullName.substring(fullName.indexOf(" ")+1,fullName.length).substring(0,fullName.substring(fullName.indexOf(" ")+1,fullName.length).indexOf(" ")).capitalize();
            last = fullName.substring(first.length +1,fullName.length).capitalize();
        }else{
            first = fullName.substring(0,fullName.indexOf(" ")).capitalize();
            last = fullName.substring(fullName.indexOf(" ")+1,fullName.length).capitalize();
        }
        document.getElementById(a).value = first;
        document.getElementById(b).value = last;
    };
    //Initial Values
    if(document.getElementById(c).value.length === 0){
        first = document.getElementById(a).value.capitalize();
        last = document.getElementById(b).value.capitalize();
        fullName =  first + " " + last ;
        console.log(fullName);
        document.getElementById(c).value = fullName;
    }
}

//Replace the ID's below with your form's field ID's
splitFullName("firstName","lastName","fullName");

Source: http://developers.marketo.com/blog/add-a-full-name-field-to-a-marketo-form/来源:http: //developers.marketo.com/blog/add-a-full-name-field-to-a-marketo-form/

You needn't use any split method and create unnecessary arrays for that operation.您无需使用任何拆分方法并为该操作创建不必要的数组。 Just use lastIndexOf and substring methods of javascript.只需使用 javascript 的lastIndexOfsubstring方法。

var s = "Paul Steve Panakkal";
var a = s.lastIndexOf(' '); // last occurence of space
var b = s.substring(0, a); // Paul Steve
var c = s.substring(a+1); // Panakkal

 const fullName = 'Paul Steve Panakkal'.split(' '); const lastName = fullName.pop(); // 'Panakkal' const firstName = fullName.join(' '); // 'Paul Steve' console.log(firstName); console.log(lastName);

Use the following code, it works for me使用以下代码,它适用于我

 let name = "Paul Steve Panakkal" let parts = name.split(' ') let firstName = parts.shift(); // Paul let lastName = parts.join(' '); // Steve Panakkal console.log({ firstName, lastName })

var firstName = fullName.split(" ")[0];

Another alternative could be using regular expression.另一种选择可能是使用正则表达式。

\w+\s\w+(?=\s)|\w+

The above regex will find firstName and lastName string pattern which matches two or three combinations of naming types.上面的正则表达式将找到匹配两个或三个命名类型组合的firstNamelastName字符串模式。

 const regex = /\w+\s\w+(?=\s)|\w+/g; const name1 = 'Paul Steve Panakkal'; const [firstName1, lastName1] = name1.trim().match(regex); console.log(`${firstName1} | ${lastName1}`); const name2 = 'John Doe'; const [firstName2, lastName2] = name2.trim().match(regex); console.log(`${firstName2} | ${lastName2}`);

Details细节

  • \w+ Match any word character. \w+匹配任何单词字符。
  • ?=\s Match any whitespace character but not catching it. ?=\s匹配任何空白字符但不捕捉它。

If you mean the last name is all the names after the first name, just use:如果您的意思是姓氏是名字之后的所有名字,只需使用:

var name = "Paul Steve Panakkal";
var arrName = name.split(" ");
var firstName = arrName.slice(0, 1).join(' ');
var lastName = arrName.slice(1, arrName.length).join(' ');

This way, both firstName and lastName are always correct这样,firstName 和 lastName 总是正确的

var names = fullName.split(' ');
if (!names || names.length <= 1) {
   firstName = this.name;
   lastName = '';
} else {
   firstName = names.slice(0, -1).join(' ');
   lastName = names.slice(-1).join(' ');
}
var fullName = "Paul Steve Panakkal";

You can use the split function to split the full name then the result like displaying elements in an array or list.您可以使用 split 函数拆分全名,然后拆分结果,例如在数组或列表中显示元素。

This is what happens when you use the split function.这就是您使用 split 功能时发生的情况。

fullName.split(" ")

["Paul", "Steve", "Panakkal"]

This is not saved to any variable.这不会保存到任何变量中。 You can perform the split function and assign an element to a well defined variable like this.您可以执行拆分功能并将元素分配给这样定义明确的变量。

var firstName = fullName.split(" ")[0];

var lastName = fullName.split(" ")[1];

var otherName = fullName.split(" ")[2];

I came up with this logic:我想出了这个逻辑:

const fullName = "Paul Steve Panakkal";
const idx = fullName.lastIndexOf(' ');
const firstName = idx !== -1 ? fullName.substring(0, idx) : fullName;
const lastName = idx !== -1 ? fullName.substring(idx + 1) : '';
console.log('firstName:', firstName, 'lastName:', lastName);

output:输出:

firstName: Paul Steve lastName: Panakkal
"  Paul Steve   ".trim().split(/(\s).+\s/).join("")  // 'Paul Steve'

您应该添加trim()以防用户不小心输入了额外的空格!

If you want the last name to be all the names after the first name:如果您希望姓氏是名字之后的所有名字:

function splitFirstLast(name) {
  return {
    firstName: name.indexOf(' ') !== -1 && name.substring(0, name.indexOf(' ')) || name,
    lastName: name.indexOf(' ') !== -1 && name.substring(name.indexOf(' ') + 1) || ''
  }
}

Objects can do the Trick with a simple function:对象可以通过一个简单的函数来解决问题:

 const fullName = "Edgar Allan Poe" const formatter = (name) => { const splitedName = name.trim().split(' ') if(splitedName.length === 0) return "" //here happens the hack!, it prevents duplicate names //JS objects overrides duplicate keys, very useful here const output = { [splitedName[0]]: splitedName[0], //storing first key [splitedName[splitedName.length - 1]]: splitedName[splitedName.length - 1] //storing last key (whose may be first key) } return Object.keys(output).join(' ').trim() //now convert object keys into a string. "E pronto rs" } console.log(formatter(fullName)) // "Edgar Poe" console.log(formatter("Elias")) // "Elias" console.log(formatter("")) // ""

This function will break any name into first name and last name storing the last word as the last name and everything else as the first name.此函数会将任何名称分解为名字和姓氏,将最后一个单词存储为姓氏,将其他所有内容存储为名字。 It returns an object which contains the separated names:它返回一个包含分隔名称的对象:

 function parseName(fullName) { const name = fullName.split(' ') const person = {} if (name.length > 1) { person.lastName = name.pop() person.firstName = name.join(' ') } else { person.lastName = "" person.firstName = obj.name } return person } console.log(parseName("Ashak Zahin Hasan")) // { firstName: "Ashak Zahin", lastName: "Hasan" }

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

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