【问题标题】:Avoiding duplication in object- Javascript避免对象中的重复 - Javascript
【发布时间】:2015-02-05 20:33:15
【问题描述】:

我有下一个对象:

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

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

例如:

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

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

【问题讨论】:

  • persons = {}; 创建一个对象,而不是一个数组。
  • 感谢您的更正 :) 我将编辑我的问题。

标签: javascript arrays duplicates javascript-objects


【解决方案1】:

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

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');

【讨论】:

  • 非常感谢:我最喜欢的回答是除了解决问题之外,还可以教人。它对我帮助很大。 :)
  • 抱歉,我正在尝试解决一个错误(与主要问题相关),但我不能...您的方法无法与我的脚本正常工作...您知道为什么吗?我用更多细节编辑了我的问题......¡对不起! T_T
  • @MartaFernandez else events[eventName] = []; events[eventName].push(cb); 应该是 else {events[eventName] = []; events[eventName].push(cb);}
  • 对不起,在我的代码中我有你所说的方式......这不是问题......:S 其他一些解释? (我绝望了……)
【解决方案2】:

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

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

【讨论】:

  • 您好,感谢您的代码。我选择了@thefourtheye 问题,因为它有一个有趣的解释。你能再看看我的问题吗?我编辑了更多细节......(因为你的解决方案不适用于我的代码:S)
猜你喜欢
  • 2012-06-27
  • 2015-07-30
  • 2016-04-17
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多