it-swarm.com.ru

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

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

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

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

Спасибо!

70
user2576960

Я предположил, что 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 }); }
}

Fiddle

133
Andy

Довольно просто проверить существующее имя пользователя:

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

Это гарантирует уникальность идентификаторов, но заставит этот массив выглядеть немного странно, если некоторые элементы будут удалены с его конца.

16
raina77ow

Этот маленький фрагмент работает на меня ..

const arrayOfObject = [{ id: 1, name: 'john' }, {id: 2, name: 'max'}];

const checkUsername = obj => obj.name === 'max';

console.log(arrayOfObject.some(checkUsername))
6
Sagar Gavhane

Лучшая практика такова.

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

Мне нравится ответ Энди, но идентификатор не обязательно будет уникальным, так что вот что я придумал, чтобы создать уникальный идентификатор. Может быть проверено в 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 };
}
1
Uxonith

Я думаю, что это самый короткий способ решения этой проблемы. Здесь я использовал функцию стрелки 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);

Ссылка на Fiddle

1
Kushan Randima

Вы можете создать прототип вашего массива, чтобы сделать его более модульным, попробуйте что-то вроде этого

    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)
0
Luis Saraza

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' } ]
0
sudo bangbang

Принятый ответ также можно записать следующим образом, используя функцию стрелки на .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 }); }
 }
0
Hemadri Dasari

Проверьте это здесь:

https://stackoverflow.com/a/53644664/1084987

Вы можете создать что-то вроде if условия потом, как 

if(!contains(array, obj)) add();
0
Clyde

Собственные функции массива иногда в 3–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>

Таким образом, вы можете достичь результата быстрее.

Примечание: Я не проверял, является ли переданный параметр пустым или нет, если вы хотите, вы можете поставить на него проверку или написать регулярное выражение для конкретной проверки.

0
Zaheen