【问题标题】:Grabbing the last names of players in array using split, splice使用拆分,拼接获取数组中玩家的姓氏
【发布时间】:2017-01-30 00:12:04
【问题描述】:

目标

我试图在一系列跨度中获取玩家的姓氏,然后能够将这些姓氏存储在他们自己的变量 var lastNameAvar lastNameB ...

这里是一些名称的示例,Pierre TurgeonLarry PateyKelly ShattenkirkBarret JackmanAlex PietrangeloJacques Plante在一种特殊情况下,此人的姓氏是St. Marseille

scripts.js

在很多情况下,我需要数组中的偶数项,但对于圣马赛,我需要 St.Marseille

    // Grabs the names of all the players in the span
    // Then, it joins the names together with a comma and a space
    var fullNames = $("li span").map(function(){
        return $(this).text();
    }).get().join(", ");

    // This breaks a name into their first name and last name
    fullNames.split(" ");

【问题讨论】:

  • 您可以将字符串拆分为一个数组,然后获取最后一个索引以防万一它们有中间名,这样您就可以得到姓氏
  • 除非您事先知道有多少部分代表名字和姓氏,否则您需要源文本来指定哪个是哪个。许多文化允许姓氏有 2 个以上的标记,并且各种标准决定了主要的标记。
  • 我只是好奇,这是他们注册的时候,您打算使用他们的注册名称并拆分它吗?为注册使用单独的输入表单不是更容易吗 - 知道您将从一个字段中获取用户的姓氏会更容易
  • @Torean 你能发一个代码示例吗
  • @Torean 这是 50 名玩家中最好的,所以我已经知道所有的名字,我只是想为这个特定用例获取姓氏

标签: javascript jquery arrays split splice


【解决方案1】:

我认为扔了一个地图功能,你只需要 tonsplit 切片并像这样加入:

 var persons = ["Pierre Turgeon", "Larry Patey", "Kelly Shattenkirk", "Barret Jackman", "Alex Pietrangelo", "Jacques Plante", "Thierry St Marseille"];
 var names = persons.map(person => person.split(" ").slice(1).join(" "));
 console.log(names);

【讨论】:

    【解决方案2】:

    好吧,你只能在第一个空格处拆分,但你会遇到像约翰史蒂文墨菲这样的名字的麻烦,其中姓氏只是“墨菲”。还有像 Gerard van der Sanden 或 Angelina de la Vega 之类的名字,其中的姓氏不仅有一个空格,而且有两个。

    归根结底,如果您没有明确的分隔符,某些输入总是会出错。

    但是,如果您的工作基础是“名字”没有任何空格(这是一个有缺陷的假设):

    var lastNames = $("li.span").map(function() {
        var name = $(this).text();
        var index = name.indexOf(" ");
        return index == -1 ? name : name.substring(index + 1);
    }).get();
    

    var lastNames = $("li.span").map(function() {
      var name = $(this).text();
      var index = name.indexOf(" ");
      return index == -1 ? name : name.substring(index + 1);
    }).get();
    console.log(lastNames);
    console.log("Note that it gets John Steven Murphy wrong, see answer text for details.");
    <ul>
      <li class="span">Pierre Turgeon</li>
      <li class="span">Larry Patey</li>
      <li class="span">Kelly Shattenkirk</li>
      <li class="span">Barret Jackman</li>
      <li class="span">Alex Pietrangelo</li>
      <li class="span">Jacques Plante</li>
      <li class="span">Michel St. Marseille</li>
      <li class="span">Gerard van der Sanden</li>
      <li class="span">Angelina de la Vega</li>
      <li class="span">John Steven Murphy</li>
    </ul>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

    【讨论】:

    • 当我运行这个 sn-p 时,我在控制台中得到“未定义”。
    • @AndrewNguyen:我认为直到现在我的答案中还没有一个 sn-p,而且那里的那个有效。
    • 在这种情况下,我知道 50 名曲棍球运动员的姓名。但是很高兴您注意到我在其他项目中处理名称时可能遇到的一些用例
    • 我希望你能详细说明这一行中发生的事情return index == -1 ? name : name.substring(index + 1);
    • @AndrewNguyen:如果indexOf 没有找到空格,则返回-1。因此,如果没有找到空格,则返回全名。否则,它只返回空格后面的内容。
    【解决方案3】:

    使用 ES 6 解构:

    let [first, middle, end] = str.split(' ');
    if (!end) {
      end = middle;
      middle = '';
    }
    

    如 cmets 中所述,这是脆弱的。你在这里得到的任何答案都是going to be fragile。在涉及姓名的任何情况下,您都必须小心行事,但对于简单的输入,这应该可以正常工作。

    【讨论】:

    • 那是非常脆弱的。
    • @T.J.Crowder 任何缺少完整解析器或特殊分隔符(如不可见的 unicode 字符)的字符串处理解决方案也是如此。
    猜你喜欢
    • 2012-09-02
    • 2019-04-04
    • 2023-03-03
    • 1970-01-01
    • 2015-12-21
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多