【问题标题】:Javascript, Working with array of objects. Take string, seperate by comma, and assign values to objectJavascript,使用对象数组。取字符串,用逗号分隔,并为对象赋值
【发布时间】:2018-11-23 17:26:11
【问题描述】:

我对 Javascript 还是很陌生,如果有任何帮助,我将不胜感激。

所以取一个如下所示的字符串:"John Doe, 5554443333, Jane Doe, 5555555555"

我们将每个人分配给一个对象,然后将该对象分配给一个数组,并打印该数组以显示我们的玩家。预期的输出是:

[{ player: 'John Doe', contact: 5554443333}, { player: 'Jane Doe', contact: 5555555555}]

我当前的输出是:

[{ player: 'Jane Doe', contact: 5555555555}, , { player: 'Jane Doe', contact: 5555555555}]

所以当前的问题是它在播放器对象之间放置了两个逗号,并且它两次列出了第二个播放器。

我的代码如下:

function playerManager(players) 
{

  var blank = [];  // blank array to return per requirements (nil, none, null, or empty string)
  var info = players.split(','); // Split our input string, into a string array, split at comma
  var data = []; // Create array to hold our players, then return.

  // function to create player 
  var player =
  {

  player: "name",
  contact: "contact"

  };

    // check if our string is empty, nil, none, or null, if it is , return our blank array 
    if(players == "" || players == "nil" || players == "None" || players == "null")
    {

    return blank;

    }

      for( i = 0; i < info.length - 1; i+=2)
      {

      player.player = info[i];
      player.contact = info[i+1];

      data[i] = player; 

      }

    return data;

}

感谢所有帮助。

【问题讨论】:

  • 请忽略将我的对象标记为函数的错误注释(它以前是构造函数)以及 if 语句是正确的,因为我们要检查字符串中的某些关键字或空白。谢谢!!!

标签: javascript arrays list object debugging


【解决方案1】:

一个更简单、更简短的声明式替代方案,假设玩家姓名和联系人始终处于相同的顺序:

const input = 'John Doe, 5554443333, Jane Doe, 5555555555';
const result = input.split(',').map(str => str.trim()).reduce((all, item, i, arr) => {

    if (i % 2 === 1) {
        all.push({player: arr[i-1], contact: Number(item)});
    } 
    return all;

}, []);

console.log(result);

【讨论】:

    【解决方案2】:

    当您使用i+=2 增加您的for..loop 并且您正在推动这样的价值

     data[i] = player; 
    

    所以最初对于0 的索引是正确的,但在下一个增量之后i 将是2。下一个值将分配给2 索引,因此您的1 索引将为空。

    因此,您可以在 for 循环中使用 Array.prototype.push() 方法,而不是在数组索引中分配值。

    演示

    const str = "John Doe, 5554443333, Jane Doe, 5555555555";
    
    function playerManager(players) {
      let arr = players.split(','),
        data = [];
    
      for (let i = 0; i < arr.length; i += 2) {
        data.push({
          player: arr[i],
          contact: arr[i + 1],
        })
      }
      return data;
    }
    
    console.log(playerManager(str))
    .as-console-wrapper {max-height: 100% !important;top: 0;}

    【讨论】:

      【解决方案3】:

      所以这里有一些问题。

      第一个简单:由于您的迭代方式i+=2,您将第二个对象推入第三个位置,即i[2]

      一种简单的修复方法是迭代一个 (i++) 直到 info.length / 2,但在您的函数中使用 i * 2

      例如:

      for( i = 0; i < info.length / 2; i++)
         {
            player.player = info[i * 2];
            player.contact = info[i * 2 + 1];
      
            data[i] = player; 
        }

      现在更难了。当您将一个对象分配给一个变量,然后将其分配给另一个变量或将其推送到一个数组中时,您并没有创建一个全新的对象 - 您只是指的是完全相同的对象,但有另一个名字。

      这里有一个小sn-p来演示:

      var a = {name: 'Joe'};
      var b = a;
      a.name = 'George';
      console.log(b.name); // This will output 'George'

      我认为,对您来说最简单的解决方法是简单地将“匿名”对象 [这可能是用词不当] 推送到数组中。

      进一步重构我们之前的循环:

          for( i = 0; i < info.length / 2; i++)
             {
                data[i] = {
                  player: info[i * 2],
                  contact: info[i * 2 + 1]
                } 
            }

      最后,还有一个小修改——在最后将一个项目“推入”数组的最佳方法是使用Array.prototype.push,这将自动修复“额外逗号”问题。

      最后,你的代码应该是这样的:

              for( i = 0; i < info.length / 2; i++)
                 {
                    data.push({
                      player: info[i * 2],
                      contact: info[i * 2 + 1]
                    });
                }

      【讨论】:

        【解决方案4】:

        看,问题是,当您使用信息创建一个玩家,然后在第一轮将其插入到玩家数组中时,您的 playerArr[0] 正在引用您创建的玩家(这是一个对象)。到目前为止没有问题。但是当它进入第二轮时,你更新了玩家对象,这也使得 playerArr[0] 也发生了变化!这是因为 playerArr[0] 实际上是一个指向播放器对象的指针(你刚刚更新了它)!

        这应该可行:

        function playerManager(players) 
        {
          var info = players.split(','); // Split our input string, into a string array, split at comma
          var data = []; // Create array to hold our players, then return.
            
        
            for( i = 0; i < info.length/2; i++)
            {
              data[i] = {player:info[i*2],contact:info[i*2+1]}; 
            }
        
            return data;
        
        }
        
        console.log(playerManager("John Doe, 5554443333, Jane Doe, 5555555555"))

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-01
          • 1970-01-01
          • 2019-01-23
          • 2013-05-06
          • 1970-01-01
          相关资源
          最近更新 更多