Подтвердить что ты не робот

Проверьте, существует ли значение объекта в массиве Javascript объектов, и если не добавить новый объект в массив

Если у меня есть следующий массив объектов:

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

Есть ли способ перебрать массив, чтобы проверить, существует ли уже определенное имя пользователя, и если оно ничего не делает, но если оно не добавляет новый объект в массив с указанным именем пользователя (и новым ID)

Спасибо!

4b9b3361

Ответ 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");
    }
}