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

IT技术 javascript arrays object for-loop foreach
2021-01-25 04:24:54

如果我有以下对象数组:

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

有没有办法循环遍历数组来检查特定的用户名值是否已经存在,如果它什么都不做,但如果它不使用所述用户名(和新 ID)将新对象添加到数组中?

谢谢!

6个回答

我假设ids 在这里是唯一的。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'));

找到的函数可以做成IF吗?类似于: if (arr.some(function (el) { el.Id == someId) 如果它存在或不存在,它将返回真或假?
2021-03-14 04:24:54
请注意,IE8 及更早版本不支持某些功能。
2021-03-15 04:24:54
哦,当然:if (arr.some(function (el) { return el.Id == someId; })) { // do something }不要忘记这一点,return否则您将一无所获。
2021-03-15 04:24:54
@stibay,some 确实返回一个布尔值。found将是truefalse取决于是否满足回调中的条件。
2021-03-21 04:24:54
谢谢安迪,这是一个非常干净的问题解决方案,并且运行良好。我之前没有遇到过 some 方法。你的假设是正确的,我的 ID 示例只是一个错字,我使用 arr.length + 1 来确定 ID。
2021-03-29 04:24:54

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

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 应该保持一致。该检查允许用户登录、退出和重新登录,而不会导致阵列超时增长。仅供参考,我将此函数与passport.js 结合使用,但我无法找到一种方法来从数组中删除用户而不使用护照代码本身。此解决方案效果很好。
2021-04-02 04:24:54

这个小片段对我有用..

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

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

console.log(arrayOfObject.some(checkUsername))

如果你有这样的元素数组,['john','marsh']我们可以做这样的事情

const checkUsername = element => element == 'john';
    
console.log(arrayOfObject.some(checkUsername))
比较优雅的做法!- 使用.some此处找到的更多详细信息和示例- developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-14 04:24:54
像魅力一样工作,谢谢。
2021-04-02 04:24:54

除了@sagar-gavhane的回答之外,这就是我所做

const newUser = {_id: 4, name: 'Adam'}
const users = [{_id: 1, name: 'Fred'}, {_id: 2, name: 'Ted'}, {_id: 3, name:'Bill'}]

const userExists = users.some(user => user.name === newUser.name);
if(userExists) {
    return new Error({error:'User exists'})
}
users.push(newUser)
这样做真的很简单 ... if(userExists) { const userId = userExists.id return userId; } ...
2021-03-24 04:24:54
嗨,如果我找到了值,我该如何访问 ID?
2021-04-04 04:24:54

我认为,这是解决这个问题的最短途径。这里我使用带有 .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);

链接到小提琴