【问题标题】:Javascript - Unable to change object value in arrayJavascript - 无法更改数组中的对象值
【发布时间】:2017-10-05 19:18:18
【问题描述】:

我有以下对象数组。每个对象都包含朋友的姓名、年龄和性别,如下所示:

var friends = [{name: "Dan",
            age: 34,
            gender: "male"},

            {name: "Chris",
            age: 30,
            gender: "male"},

            {name: "Laura",
            age: 32,
            gender: "female"}];

我必须编写一个函数,它可以带三个朋友中的任何一个,并将他们的年龄加一岁。我写了这个:

function hasBirthday(name){
    friends.forEach(function(person){
        if(name === person.name){
        person.age += 1;
        }
    }); return person.age;
}

假设我想将 Laura 的年龄从 32 岁更改为 33 岁。我会这样调用该函数:

hasBirthday("Laura");

如果我将函数分配给一个变量,然后 console.log 它,我希望输出为 33。但是,我总是收到以下错误消息:

ReferenceError: person is not defined.

谁能解释我为什么不断收到此错误消息?我完全被难住了。谢谢。

【问题讨论】:

  • 为什么要在人名中添加数字?你不想person.age吗?
  • 好吧,我的意思是,person 实际上在您的退货声明中是未定义的。 (它在 forEach 之外)
  • 如果您的目标是返回新时代,则必须将该值存储在 for each 之外的变量中,然后在 for each 之后返回该变量的值。或者使用 for 循环并在里面返回。
  • 谢谢凯文。你已经解决了这个问题。非常感谢。

标签: javascript arrays object


【解决方案1】:

您将 person.age 返回到 forEach 循环的范围之外。为了解决这个问题,您可以声明一个变量,该变量可以跟踪您询问的朋友的年龄。您还可以通过当前元素的索引更改朋友数组中的年龄。

var friends = [{name: "Dan",
        age: 34,
        gender: "male"},

        {name: "Chris",
        age: 30,
        gender: "male"},

        {name: "Laura",
        age: 32,
        gender: "female"}]; 

function hasBirthday(name){
    var current_age = 0;
    friends.forEach(function(person, i){
        if(name === person.name){
            current_age = person.age + 1;
            friends[i].age = current_age; // you can update the global array as well.
        }
    });
    return current_age;
} 

hasBirthday("Laura");

console.log(friends);

【讨论】:

    【解决方案2】:

    只需删除return person.age;

    function hasBirthday(name){
        friends.forEach(function(person){
            if(name === person.name){
                person.age += 1;
            }
        });
        // return person.age;
    }
    hasBirthday("Laura"); //Laura has 33 now
    

    如果你还需要hasBirthday("Laura")的新时代,那么就这样修改吧。

    function hasBirthday(name){
        var new_age = 0;
        friends.forEach(function(person){
            if(name === person.name){
                person.age += 1;
                new_age = person.age;
            }
        });
        return new_age;
    }
    alert(hasBirthday("Laura")); //Laura has 33 now
    

    想想如果你有两个“劳拉”,函数只返回最后一个匹配。另外,当人不存在时,函数返回0。

    【讨论】:

      【解决方案3】:

      您没有为年龄添加 +1。您必须比较姓名并为该人的年龄添加 +1

      function hasBirthday(name){
          friends.forEach(function(person){
              if(name === person.name){
              person.age += 1;
              }return person.age;
          }); 
      }

      【讨论】:

      • return person.age 仍未定义
      猜你喜欢
      • 2023-03-20
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多