Проверьте, существует ли значение объекта в массиве объектов Javascript, и если нет, добавьте новый объект в массив
Если у меня есть следующий массив объектов:
[ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ]
есть ли способ перебрать массив, чтобы проверить, существует ли уже определенное значение имени пользователя, и если оно ничего не делает, но если оно не добавляет новый объект в массив с указанным именем пользователя (и новым идентификатором)?
спасибо!
9 ответов:
Я предполагал, что
ids должны быть уникальными здесь.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это гарантирует уникальность идентификаторов, но сделает этот массив немного странным, если некоторые элементы будут сняты с его конца.
этот небольшой фрагмент работает для меня..
const arrayOfObject = [{ id: 1, name: 'john' }, {id: 2, name: 'max'}]; const checkUsername = obj => obj.name === 'max'; console.log(arrayOfObject.some(checkUsername))
мне нравится ответ Энди, но идентификатор не обязательно будет уникальным, поэтому вот что я придумал, чтобы создать уникальный идентификатор. Можно проверить по адресу jsfiddle тоже. Обратите внимание, что
arr.length + 1может очень хорошо не гарантировать уникальный идентификатор, если что-то было удалено ранее.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 }; }
Лучшая практика такова.
var arr = ["a","b","c","d"]; console.log(arr.includes("a")); //---- true; console.log(arr.includes("k")); //---- false; console.log(arr.includes("c")); //---- true;
вы можете прототипировать свой массив, чтобы сделать его более модульным, попробуйте что-то вроде этого
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)
Я думаю, что это самый короткий путь решения этой проблемы. Здесь я использовал функцию стрелки 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);
собственные функции массива иногда в 3X - 5X раз медленнее, чем обычные циклы. Плюс родные функции не будут работать во всех браузерах, так что есть проблемы совместимости.
Мой Код:
<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>таким образом, вы можете добиться результата быстрее.
Примечание: Я не проверял, является ли переданный параметр пустым или нет, если вы хотите, вы можете проверить его или написать регулярное выражение для конкретной проверки.
принятый ответ также может быть записан следующим образом с помощью функции стрелки on .некоторые
function checkAndAdd(name) { var id = arr.length + 1; var found = arr.some((el) => { return el.username === name; }); if (!found) { arr.push({ id: id, username: name }); } }
Comments