Javascript - 从数组中删除重复的对象

时间:2014-05-07 22:16:45

标签: javascript arrays forms angularjs object

我正在构建一个涉及创建对象数组的应用程序,类似于:

var foo = [{
'foo' : 'foo1' 
},
{
'foo' : 'foo2' 
},
{
'foo' : 'foo3' 
}];

然后是一个HTML表单,用户填写新对象的值。提交表单时,新值将推送到数组。我想要的是一个if / else语句,它检查新对象是否已存在于数组中。 如下所示:

document.getElementById('form').addEventListener('submit',function(){
var newObject = {'foo' : input value goes here }
if (//Checks that newObject doesn't already exist in the array) {
    foo.push(newObject)
}
else {
//do nothing
}
});

我也可能值得注意的是我使用的是Angular

2 个答案:

答案 0 :(得分:1)

您可以使用此方法:

你需要:

  1. 了解如何比较2个对象。
  2. 循环。
  3. 如何比较2个对象。

    其中一种方式是:

    JSON.stringify(obj1) === JSON.stringify(obj2) 
    

    注意,以这种方式比较ojbects并不好:

      

    将对象序列化仅仅是为了比较是非常昂贵的而不是   保证可靠

    正如在这篇文章的评论中提到的cookie怪物。 我只是建议它,实现你想要的。你可以找到更好的变种。你可以找到一些漂亮的答案here

    如何在周期中进行:D

    在你的情况下,它将是:

    function checkIfObjectExists(array, newObject) {
        var i = 0;
        for(i = 0; i < array.length; i++ ) {
            var object = array[i];
            if(JSON.stringify(object) === JSON.stringify(newObject)) 
            {
                return true;
            }   
        }
        return false;
    }
    

    另外,我添加了功能,因此您可以在代码中使用它。

    现在将其添加到您的代码中:

    if (checkIfObjectExists(foo, newObject)) {
        // objects exists, do nothing
    }
    else {
        foo.push(newObject);
    }
    

    DEMO

答案 1 :(得分:0)

你必须遍历foo-array并检查是否有重复项。

document.getElementById('form').addEventListener('submit',function(){
    var newObject = {'foo' : input value goes here }
    if (!isInArray(foo, newObject, 'foo')) {
        foo.push(newObject)
    }
});
function isInArray(arr, newObj, type) {
    var i, tempObj, result = false;
    for (i = 0; i < arr.length; i += 1) {
        tempObj = arr[i];
         if (tempObj[type] === newObj[type]) {
            result = true;
        }
    }
    return result;
}

如果您的数组不包含对象,则更容易,更快。然后你只需将if子句设为:

document.getElementById('form').addEventListener('submit',function(){
    var newString = "foo bar";
    if (foo.indexOf(newString) === -1) {
        foo.push(newString);
    }
});