javascript 拆分还是切片?

javascript split or slice?

我有一个功能可以抓取我页面上的当前用户。 变量 currentUser 等于用户的全名。有时这只是 FirstName LastName 但有时它是 FirstName MiddleName LastName。

我希望能够通过“”拆分(或切片)currentUser 并设置变量 FirstName 和 LastName。如果有 MiddleName,我希望它设置变量 MiddleName。

如有任何帮助,我们将不胜感激!

编辑:

目前我试过只返回名字的第一个字母和姓氏的最后一个字母。我还没有尝试设置中间名变量。见下文。谢谢!

function getCurrentUserEmail() {

var requestUri = "../_api/web/currentUser";
var requestHeaders = {"accept": "application/json;odata=verbose"};
$.ajax({
  url: requestUri,
  contentType: "application/json;odata=verbose",
  headers: requestHeaders,
  success:   function onSuccess(data, request){
                var FullName = data.d.Title;
                var EmailAddress = data.d.Email;
                CurrentUserEmail = EmailAddress;
                CurrentUser = FullName;
                name = CurrentUser.split(" ");
                fName = name[0];
                lName = name[1];                                    
  },
  error: function (error) {}
});
}

我认为 split 可能是最好的方法:

var segments = currentUser.split(' ');
var firstName = segments[0];
var lastName = segments[segments.length - 1];
var middleName = segments.length === 3 ? segments[1] : undefined;

这里,firstNamelastName不管数组的长度,或者有多少段都有效,但是middleName会在正好有3 段。

可能还有另一种方法 splice;它可能看起来像这样:

var segments = currentUser.split(' ');

var firstName = segments.splice(0, 1)[0];
var middleName = segments.splice(0, 1)[0];
var lastName = segments.splice(0, 1)[0] || middleName;
if (middleName === lastName) {
    middleName = undefined;
}

alert(firstName + middleName + lastName);

老实说,我不认为那是干净的。

function splitName(input) {
  var arrayName = input.split(' ');
  
  var name = arrayName[0];
  var surname = arrayName[1];

  if (arrayName.length === 3) {
      var middleName = arrayName[1];
      surname = arrayName[2];
  }

  console.log('Name ' + name);
  if (middleName)
      console.log('Middlename ' + middleName);
  console.log('Surname ' + surname);
}

var a = "Name Middlename Surname";
var b = "Name Surname" 

splitName(a);
console.log('#');
splitName(b);

使用var s = string.split()函数。数组中的 s[0]s[1]s[2] 值将关联到名称部分。

通过split在空格上命名来创建一个数组。

  1. pop获取姓氏的数组。
  2. shift获取名字的数组。
  3. shift 数组再次得到中间名。 OR (||) 如果没有中间名,则结果为空字符串。

如果名字、中间名和姓氏各包含一个单词,此方法有效。

var name= 'Homer J Simpson';
var n = name.split(' ');
lastName= n.pop();             //Simpson
firstName= n.shift();          //Homer
middleName= n.shift() || '';   //J
console.log(firstName+' - '+middleName+' - '+lastName);

var name= 'Homer Simpson';
var n = name.split(' ');
lastName= n.pop();             //Simpson
firstName= n.shift();          //Homer
middleName= n.shift() || '';   //null string
console.log(firstName+' - '+middleName+' - '+lastName);

您可以使用 拆分和切片来完成此操作。这是一个使用切片的示例解决方案:

var firstName = name.slice(0, name.indexOf(" "));
var lastName = name.slice(name.lastIndexOf(" ")+1, name.length);
var middleName = name.slice(name.indexOf(" ")+1, name.lastIndexOf(" "));

注意:无法从字符串中准确判断什么是中间名。我们假设给定一个包含两个或三个单词的字符串,中间的单词是中间名。向 先生致歉。 Andrew van den Houten 先生。 José Maria De Las Mercedes Acosta.

演示: JSBin

所以我在这里做了一个普通的Javascript解决方案,能够解决很多问题...

我正在使用拆分功能 为了清除前缀,我正在使用 John Resigs 数组删除函数。

正如对已接受答案的评论中所建议的那样,您可以从您的服务器获取中间数组和不相关的(前缀)数组,也许...

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};

//You can Add all Irrelevant Words in here
var irrelevant = ["Dr", "baron"];

//here is the case of the NonMiddleNameButStillInTheMiddleStuff
var nonMiddleStuff = ["von"];

//Here is the Code
var full = document.getElementById("fullname").innerHTML;
var names = full.split(" ");
getNameStuffDone(names);

var full = document.getElementById("fullname2").innerHTML;
var names = full.split(" ");
getNameStuffDone(names);

//Function getNameStuffDone
function getNameStuffDone(names) {
  var firstName, lastName, middleName;
  if (names.length > 2) {
    for (var i = 0; i < irrelevant.length; i++) {
      for (var j = 0; j < names.length; j++) {
        if (names[j].toUpperCase() == irrelevant[i].toUpperCase()) {
          names.remove(j, j);
        }
      }
    }
    if (names.length > 2) {
      firstName = names[0];
      if (nonMiddleStuff.indexOf(names[1]) >= 0) {
        lastName = names[1] + " " + names[2];
        names.remove(1, 1);
      } else {
        middleName = names[1];
        lastName = names[2];
      }
    } else {
      firstName = names[0];
      lastName = names[1];
    }
  } else {
    firstName = names[0];
    lastName = names[1];
  }


  if (names.length > 2) {
    alert("With Middle Name: " + firstName + " " + middleName + " " + lastName);
  } else {
    alert("Without Middle Name: " + firstName + " " + lastName);
  }
}
<span id="fullname">Anders von Schnurzenstein</span><br>
<span id="fullname2">Baron Dr Anders Patrick Schnurzenstein</span>