避免在对象中重复 - Javascript

时间:2014-12-08 08:02:27

标签: javascript arrays duplicates javascript-objects

我有下一个目标:

var persons= {};
persons["Matt"].push("A");
persons["Matt"].push("B");
persons["Matt"].push("C");

我想知道对象是否包含我尝试插入的元素。

E.g:

persons["Matt"].push("A"); /* The element A already exist... And I don't want duplicate elements.*/

有人知道一种方法吗?

更详细的编辑:

我有下一个代码:

function insertIfNotThere(array, item) {
    if (array.indexOf(item) === -1) {
        array.push(item);
    }
}

function EventManager(target) {
    var target = target || window, events = {};
    this.observe = function(eventName, cb) {
        if (events[eventName]){
           insertIfNotThere(events[eventName], cb);
        }else{
           events[eventName] = []; events[eventName].push(cb);
        }
        return target;
    };

    this.fire = function(eventName) {
        if (!events[eventName]) return false;
        for (var i = 0; i < events[eventName].length; i++) {
        events[eventName][i].apply(target, Array.prototype.slice.call(arguments, 1));
        }
    };
}

我使用您的方法检查是否存在指示内容的元素。但是......它推动了元素......我不知道发生了什么......

2 个答案:

答案 0 :(得分:3)

首先要做的事情。当你这样做

persons= {};

您正在创建一个名为persons的全局属性,并为其指定一个空对象。你可能想要一个局部变量。所以,将其改为

var persons = {};

然后,当您在对象中创建新密钥时,默认情况下,该值将为undefined。在您的情况下,您需要存储一个数组。所以,你必须像这样初始化它

persons['Matt'] = [];

然后你可以使用Array.prototype.indexOf函数来确定所添加的项目是否已经存在于数组中(如果在数组中找不到该项,则返回-1),像这样

if (persons['Matt'].indexOf("A") === -1) {
    persons['Matt'].push("A");
}
if (persons['Matt'].indexOf("B") === -1) {
    persons['Matt'].push("B");
}

您可以创建一个功能来执行此操作

function insertIfNotThere(array, item) {
    if (array.indexOf(item) === -1) {
        array.push(item);
    }
}

var persons = {};
persons['Matt'] = [];
insertIfNotThere(persons['Matt'], 'A');
insertIfNotThere(persons['Matt'], 'B');

 // This will be ignored, as `A` is already there in the array
insertIfNotThere(persons['Matt'], 'A');

答案 1 :(得分:1)

使用indexOf检查是否存在A.如果它不存在(为-1),请将其添加到数组中:

if (persons['Matt'].indexOf('A') === -1) {
  persons['Matt'].push('A');
}