检查特定属性值的对象数组

时间:2013-09-30 18:40:19

标签: javascript

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

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

我将输入值分配给变量,使用它们创建一个新的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);

})();

2 个答案:

答案 0 :(得分:2)

您的列表是list Person(如果rankings.pushlist.push),那么当您正在尝试比较(list[i] === name)时字符串文字的Person对象。尝试(list[i].name.toLowerCase() === name.toLowerCase())

答案 1 :(得分: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);
}