0

我正在创建一个小程序,其中有一个带有两个输入字段的页面,用户可以输入他们的姓名和他们今天吃的卡路里数。一个人输入他们的数据后,我想将其与其他人的数据一起显示在按总卡路里排序的列表中。

我还希望那个人能够重新输入他们的姓名和额外的卡路里,并让它更新他们的总卡路里(而不是用他们的名字和最近的卡路里量创建另一个条目)。

我将输入值分配给变量,使用它们创建一个新的 Person 对象,然后将该对象推送到一个数组。

如何测试数组是否包含名称已存在的 Person 对象?我的测试无法识别已提交的名称。如果已经输入了一个人的名字,我想更新他们的总卡路里而不是创建一个新的 Person 对象。

我的 JavaScript 代码:

(function () {
    "use strict";

    /* Person object constructor */
    function Person(name, calories) { 
        this.name = name;
        this.calories = calories;
    }

    function addToList() {
        var name = document.getElementById('name').value;
        var calories = document.getElementById('calories').value;

        /* 
            Check to see if list already contains person's name
            If yes, update their calorie amount.
            If not, create a new player and add them to the list.
         */

        for (var i = 0; i < list.length; i++) {
            if (list[i] === name) {
                alert('This person already exists.');
            } else {
                var newPerson = new Person(name, calories);
                list.push(newPerson);
            }   
        }
    }

    var list = [];
    $('#add').click(addToList);

})();
4

2 回答 2

2

您的列表是listof Person(如果rankings.pushlist.push),因此当您这样做时(list[i] === name),是在尝试将Person对象与字符串文字进行比较。尝试做(list[i].name.toLowerCase() === name.toLowerCase())

于 2013-09-30T18:48:15.700 回答
1

看起来您将名称存储在数组list中,但是这些名称永远不会添加到list. 相反,您似乎正在使用另一个名为rankings.

rankings.push(newPerson);
list.push(name);

而且由于您已经有一个存储人员的数组rankings,也许您应该对其进行迭代?

var foundPerson = false;
for (var i = 0; i < rankings.length; i++) {
    if (rankings[i].name === name) {
        alert('This person already exists.');

        // do your update
        rankings[i].calories = calories;

        // set flag so we know we actually found a person
        foundPerson = true;
        break;
    } 
}

// if no person found, add new person
if (!foundPerson) {
    var newPlayer = new Person(name, calories);
    rankings.push(newPerson);
}
于 2013-09-30T18:48:57.917 回答