我正在构建一个涉及创建对象数组的应用程序,类似于:
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
答案 0 :(得分:1)
您可以使用此方法:
你需要:
其中一种方式是:
JSON.stringify(obj1) === JSON.stringify(obj2)
注意,以这种方式比较ojbects并不好:
将对象序列化仅仅是为了比较是非常昂贵的而不是 保证可靠
正如在这篇文章的评论中提到的cookie怪物。 我只是建议它,实现你想要的。你可以找到更好的变种。你可以找到一些漂亮的答案here。
在你的情况下,它将是:
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);
}
答案 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);
}
});