【问题标题】:javascript split or slice?javascript拆分或切片?
【发布时间】:2015-09-02 21:44:14
【问题描述】:

我有一个函数可以抓取我页面上的当前用户。 变量 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) {}
});
}

【问题讨论】:

  • 你能给我们展示一些你的作品吗?
  • Baron von Smellypants - 是中间名 von?还是姓 von Smellypants?
  • 您在执行您所描述的操作时有任何问题吗?什么问题?
  • @Adam 无法理解名称的一部分是在姓氏中还是在中间名中或在名称本身中。实现这一目标的唯一方法是列出可能的组合或用户可以输入姓名和姓氏的不同字段。例如在意大利语中,Maria Carlotta Lanzi 是名字 + 姓氏,而 Francesca Carlotta Lanzi 是名字 + 中间名 + 姓氏。
  • @rpadovani - 这就是我的观点。除非这是一个家庭作业问题(看起来可能是),否则我主张用户退后一步,看看他们试图解决的实际问题。

标签: javascript split slice


【解决方案1】:

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

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

这里,firstNamelastName 工作,无论数组的长度如何,或者存在多少段,但是当恰好有 3 段时,middleName 将被设置。

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);

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

【讨论】:

  • 你会如何处理Adam's example“Baron von Smellypants”?
  • @Stijn - 这是个好问题。我可能会从服务器发回一组已知的姓氏前缀,例如von 并为此分支。该数据库将通过一些离线进程定期更新。
  • @Stijn - 根据 OPs 问题,无法正确处理它。我主张 OP 也许应该着眼于他们试图解决的问题,而不是他们如何使用 split 来获取字符串的单独组件。
【解决方案2】:

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

我正在使用拆分功能 为了清除前缀,我使用 John Resigs Array Remove Function。

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

// 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>

【讨论】:

    【解决方案3】:

    变量

    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);

    【讨论】:

      【解决方案4】:

      通过splitting 空格上的名称创建一个数组。

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

      只有当名字、中间名和姓氏各包含一个单词时,此方法才有效

      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);

      【讨论】:

        【解决方案5】:

        您可以使用 both 拆分和切片来做到这一点。这是一个使用切片的示例解决方案:

        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 先生。何塞·玛丽亚·德拉斯·梅赛德斯·阿科斯塔。

        演示: JSBin

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2021-02-11
            • 2013-01-21
            • 2017-02-16
            • 2014-01-28
            • 1970-01-01
            • 2016-02-16
            • 2022-01-07
            • 1970-01-01
            • 2021-11-18
            相关资源
            最近更新 更多