检查对象的Javascript数组中是否存在对象值,如果不是,则将新对象添加到数组中

如果我有以下的对象数组:

[ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ] 

有没有办法通过数组循环来检查一个特定的用户名值是否已经存在,如果它没有做任何事情,但如果它不添加一个新的对象与所述用户名(和新ID)的数组?

谢谢!

我认为id是在这里独一无二的。 some是检查数组中事物存在的一个很好的函数:

 function checkAndAdd(name) { var id = arr.length + 1; var found = arr.some(function (el) { return el.username === name; }); if (!found) { arr.push({ id: id, username: name }); } } 

小提琴

检查现有用户名是相当简单的:

 var arr = [{ id: 1, username: 'fred' }, { id: 2, username: 'bill'}, { id: 3, username: 'ted' }]; function userExists(username) { return arr.some(function(el) { return el.username === username; }); } console.log(userExists('fred')); // true console.log(userExists('bred')); // false 

但是当你不得不向这个数组添加一个新用户时,怎么办也不是很明显。 最简单的方法 – 只需要推入一个id等于array.length + 1的新元素:

 function addUser(username) { if (userExists(username)) { return false; } arr.push({ id: arr.length + 1, username: username }); return true; } addUser('fred'); // false addUser('bred'); // true, user `bred` added 

它将保证ID的唯一性,但是如果一些元素将被取消,会使这个数组看起来有点奇怪。

我喜欢Andy的回答,但是ID不一定是唯一的,所以这就是我想出来创build一个唯一的ID。 也可以在jsfiddle进行检查。 请注意,如果以前删除了任何东西,那么arr.length + 1可能不能保证唯一的ID。

 var array = [ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 3, username: 'ted' } ]; var usedname = 'bill'; var newname = 'sam'; // don't add used name console.log('before usedname: ' + JSON.stringify(array)); tryAdd(usedname, array); console.log('before newname: ' + JSON.stringify(array)); tryAdd(newname, array); console.log('after newname: ' + JSON.stringify(array)); function tryAdd(name, array) { var found = false; var i = 0; var maxId = 1; for (i in array) { // Check max id if (maxId <= array[i].id) maxId = array[i].id + 1; // Don't need to add if we find it if (array[i].username === name) found = true; } if (!found) array[++i] = { id: maxId, username: name }; } 

你可以原型arrays,使其更模块化,尝试这样的事情

  Array.prototype.hasElement = function(element) { var i; for (i = 0; i < this.length; i++) { if (this[i] === element) { return i; //Returns element position, so it exists } } return -1; //The element isn't in your array }; 

你可以使用它:

  yourArray.hasElement(yourArrayElement) 

我认为这是解决这个问题的最短路线。 在这里,我用.filter的ES6箭头函数来检查新添加的用户名的存在。

 var arr = [{ id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 3, username: 'ted' }]; function add(name) { var id = arr.length + 1; if (arr.filter(item=> item.username == name).length == 0){ arr.push({ id: id, username: name }); } } add('ted'); console.log(arr); 

链接到小提琴

最佳实践就是这样。

 var arr = ["a","b","c","d"]; console.log(arr.includes("a")); //---- true; console.log(arr.includes("k")); //---- false; console.log(arr.includes("c")); //---- true; 

数组的本地函数有时比正常循环慢3倍 – 5倍。 加上本机function不会在所有的浏览器工作,所以有一个兼容性问题。

我的代码:

 <script> var obj = []; function checkName(name) { // declarations var flag = 0; var len = obj.length; var i = 0; var id = 1; // looping array for (i; i < len; i++) { // if name matches if (name == obj[i]['username']) { flag = 1; break; } else { // increment the id by 1 id = id + 1; } } // if flag = 1 then name exits else push in array if (flag == 0) { // new entry push in array obj.push({'id':id, 'username': name}); } } // function end checkName('abc'); </script> 

这样可以更快地达到结果。

注意:我还没有检查传递的参数是否为空,如果你想要的话,你可以检查一下,或者写一个正则expression式来进行特定的validation。