Проверьте, существует ли значение объекта в массиве Javascript объектов, и если не добавить новый объект в массив
Если у меня есть следующий массив объектов:
[ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ]
Есть ли способ перебрать массив, чтобы проверить, существует ли уже определенное имя пользователя, и если оно ничего не делает, но если оно не добавляет новый объект в массив с указанным именем пользователя (и новым ID)
Спасибо!
Ответы
Ответ 1
Я предположил, что id
здесь уникален. some
- отличная функция для проверки наличия вещей в массивах:
const arr = [{ id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 3, username: 'ted' }];
function add(arr, name) {
const { length } = arr;
const id = length + 1;
const found = arr.some(el => el.username === name);
if (!found) arr.push({ id, username: name });
return arr;
}
console.log(add(arr, 'ted'));
Ответ 2
Это довольно тривиально для проверки существующего имени пользователя:
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
Это гарантирует уникальность идентификаторов, но сделает этот массив немного странным, если некоторые элементы будут сняты с его конца.
Ответ 3
Этот небольшой сниппс работает для меня..
const arrayOfObject = [{ id: 1, name: 'john' }, {id: 2, name: 'max'}];
const checkUsername = obj => obj.name === 'max';
console.log(arrayOfObject.some(checkUsername))
Ответ 4
Я думаю, что это самый короткий путь решения этой проблемы. Здесь я использовал функцию со стрелкой ES6 с .filter, чтобы проверить наличие нового добавления имени пользователя.
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);
Ссылка на скрипт
Ответ 5
Лучшая практика такова.
var arr = ["a","b","c","d"];
console.log(arr.includes("a")); //---- true;
console.log(arr.includes("k")); //---- false;
console.log(arr.includes("c")); //---- true;
Ответ 6
Мне нравится, как Энди отвечает, но идентификатор не обязательно будет уникальным, поэтому здесь я также создал уникальный идентификатор. Можно проверить на 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 };
}
Ответ 7
Вы можете прототипировать свой массив, чтобы сделать его более модульным, попробуйте что-то вроде этого
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)
Ответ 8
Нативные функции массива иногда в 3X - 5 раз медленнее, чем обычные. Плюс собственные функции не будут работать во всех браузерах, поэтому возникают проблемы совместимости.
Мой код:
<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>
Таким образом вы можете быстрее достичь результата.
Примечание.. Я не проверял, пуст ли параметр, или нет, если вы хотите, чтобы вы могли проверить его или написать регулярное выражение для конкретной проверки.
Ответ 9
Принятый ответ также можно записать следующим образом, используя функцию стрелки на.some
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 }); }
}
Ответ 10
xorWith
в Lodash можно использовать для достижения этого
let objects = [ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ]
let existingObject = { id: 1, username: 'fred' };
let newObject = { id: 1729, username: 'Ramanujan' }
_.xorWith(objects, [existingObject], _.isEqual)
// returns [ { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ]
_.xorWith(objects, [newObject], _.isEqual)
// returns [ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ,{ id: 1729, username: 'Ramanujan' } ]
Ответ 11
Проверьте это здесь:
fooobar.com/questions/623/...
Вы можете создать что-то вроде состояния после этого, например
if(!contains(array, obj)) add();
Ответ 12
функция number_present_or_not() { var arr = [ 2,5,9,67,78,8,454,4,6,79,64,688 ] ;
найденная переменная = 6; var found_two; для (я = 0; я
}
if ( found_two == found )
{
console.log("number present in the array");
}
else
{
console.log("number not present in the array");
}
}