检查数组中是否存在键并使用变量设置新值时发出问题

时间:2013-12-30 08:26:39

标签: javascript arrays json

我正在尝试检查数组中是否存在密钥并在其中进行更改,如果不存在则添加。我需要在没有jQuery的情况下完成它。 我将数组存储在字符串中。

if (item_id in items) items[item_id] = count;
else
{
    var tmp = {};
    tmp[item_id] = count;
    items.push(tmp);
}

item_idcount始终是数字。问题是,当我检查密钥是否存在时,它会检查数组中的元素数量。例如,如果我有对[{1:5},{5,3}]并检查键5是否存在则返回false,如果我检查键1,则返回true并更改数组[{1:5},new_value]

我尝试了if (item_id in items)if (items[item_id]),但没有效果。我该如何让它正常工作?

2 个答案:

答案 0 :(得分:2)

简单修复

items是一个常规的JS数组,而不是一个关联数组。您必须循环并检查每个对象的item_id,如下所示。如果在循环中找不到列表中的任何位置,则将其添加到列表中(正如原始else所做的那样):

var found = false;

for (var i=0; i < items.length; i++) {
    if (item_id in items[i]) {
        items[i][item_id] = count;
        found = true;
        break;
    }
}

if (!found)
{
    var tmp = {};
    tmp[item_id] = count;
    items.push(tmp);
}

更完整的解决方案

请注意,您可能遇到的一些困难可能是由于您选择了不寻常的数据结构,并且您可能选择以不同方式构建数据以便于查找和检索。现在你有一个不相关的对列表,[{key1 : value1}, {key2: value2}, ...]当你真的想要一个字典(哈希映射),如{ key1: value1, key2: value2, ...}

如果您使用更新的结构,您的代码看起来将更像您的原始代码:

if (item_id in items) items[item_id] += count;
else
{
    items[item_id] = count;
}

(我假设您实际上想要增加count(如果它已经存在),而不是覆盖它。这假设一个关联数组(字典)作为您的数据结构。)

答案 1 :(得分:0)

尝试使用

array.indexOf(searchElement[, fromIndex]);

如果你可以使用jQuery,它有一个实用功能。

$.inArray(value, array)