如何检查数组是否包含Javascript中具有相同字段的对象?

时间:2016-07-25 08:43:48

标签: javascript arrays javascript-objects

处理此问题的最佳方法是什么? 考虑我正在处理注册列表数据库,我想知道用户是否已经存在相同的用户名?

类似的东西:

for (var i = 0; i < database.user.length; ++i) {
    if( database.user[i].username === username ) {
        return true;
    }
}
return false;

还有更好的东西吗?

PS1:database.user是一个对象数组

PS2:我已经了解Array->indexOf功能,但它没有帮助。

2 个答案:

答案 0 :(得分:1)

在javascript中,任何其他这样做的方式只是隐藏了这样一个事实:在引擎盖下,它们正在完全按照您的代码所做的那样。

例如,您可以过滤数组,并检查其长度是否为>= 1

var userExists = database.user.filter(u => u.username === username).length >= 1;

它更短,可以说比原版更具可读性,但它不一定是最好的,也不可能更快。

稍微好一点的是使用find - 因为一旦元素匹配就会返回,这意味着整个数组都不会被评估

var userExists = database.user.find(u => u.username === username) !== undefined;

some也适用)

注意,这个答案使用ES6格式表示lambda表达式,不支持的浏览器中的等价物是

var userExists = database.user.filter(function(u) {return  u.username == username;}).length >= 1
// or
var userExists = database.user.find(function(u) {return  u.username == username;}) !== undefined;

答案 1 :(得分:1)

即使索引0处的项与您的查询匹配,您的代码也会一直遍及整个数组。您可以使用Array.prototype.some但与Array.prototype.findIndex相比,即使是那个也会达不到性能。所以我的建议是使用findIndex。

database.user.findIndex(e => e.username === username) === -1 && login(username);