2017-10-05 36 views
-4

我有以下數組對象。每個對象都包含一個朋友,他們的年齡和性別,像這樣的名字:Javascript - 無法更改數組中的對象值

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

比方說,我想改變勞拉的從32到33歲的時候我會打電話的功能正是如此:

hasBirthday("Laura"); 

如果我是分配的功能一個變量,然後CONSOLE.LOG它,我希望可以將輸出爲33。但是,我總是得到以下錯誤消息:

ReferenceError: person is not defined. 

可能有人能夠解釋爲什麼我不斷收到此錯誤信息任何光線?我完全被難住了。謝謝。

+2

你爲什麼要給人名添加一個數字?你不想要'person.age'嗎? –

+3

好吧,我的意思是,「人」實際上在您的退貨聲明中未定義。 (它在forEach之外) –

+0

如果您的目標是要返回新時代,那麼您必須將該值存儲在每個變量之外的變量中,然後在每個變量之後返回該變量的值。或者使用for循環並返回。 –

回答

-3

您正在將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); 
-3

你沒有加入年齡+1。你要比較的名字,並添加+1到人的年齡

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

+0

'return person。年齡'仍然未定義 –

+0

我編輯了我的答案,你看過這個嗎? –

+0

從forEach返回有什麼好處呢? –

-1

有代碼中的一些錯誤。

首先,您正試圖增加一個人名稱,這是行不通的。

其次,當你寫:

function hasBirthday(name){ 
    friends.forEach(function(person){ 
     // Into the foreach, person is defined 
     if(name === person.name){ 
     person.name += 1; 
     } 
    }); 
    // Outside the foreach, person is undefined. 
    return person.name; 
} 

所以,現在,讓我們說你想要做你想要什麼。我會用find功能:

function hasBirthday (name) { 
    let person = friends.find(x => x.name === name); 
    if (typeof person !== 'undefined') { 
     person.age++; 
     return person.age 
    } 
    return undefined 
} 
+0

在這裏找到了哪些有益的東西?如果兩個同名的人有相同的生日呢?簡單地抽取第一個匹配條件將會失敗,測試 –

+0

我相信兩個同名的人可能會有不同的生日......我會讓我的函數使用某種唯一標識符,並使用find函數...如果我們迭代朋友的生日,這個foreach將會很有用 – Hammerbot

-1

只是刪除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.