[英]How in JS check if array of objects contains one object?
我有以下代碼:
var users = [];
users.push({
username: "admin",
password: "admin"
});
this.showAllUsers = function() {
console.log(users);
};
this.addUser = function(user) {
if('username' in user && 'password' in user) {
users.push({
username: user.username,
password: user.password
})
}
else {
throw "Invalid object";
}
};
this.isExist = function(user) {
console.log(users.indexOf({
username: "admin",
password: "admin"
}));
};
為什么控制台日志始終一直打印-1? Users數組包含帶有對象的數組,該對象的屬性用戶名:“ admin:”,密碼:“ admin”。
indexOf
方法使用嚴格等於( ===
)。 當您使用{foo: bar}
,您將創建一個新的(唯一的)對象,該對象的計算結果不完全等於數組中已有的任何值。
您應該做的是遍歷數組,並使用一個函數使用深度相等性比較每個對象。 簡而言之,您可以使用類似:
function match(arr, ref) { // Take an array and a reference object
return arr.filter(function (cur) { // Select any items in the array...
return Object.keys(ref).every(function (key) { // Where all keys...
return ref[key] === cur[key]; // Have the same value in the item and reference
});
});
}
在這里看看indexOf 。
請記住,在客戶端管理密碼是安全漏洞。
this.isExist = function(user) {
console.log(users.indexOf({
username: "admin",
password: "admin"
}));
};
這里的問題是您要檢查users數組是否包含要創建的新對象。 由於它是一個新對象,因此顯然不會包含它。 您需要檢查users對象是否包含用戶名或密碼等於“ admin”的任何對象。 也許像
this.isExist = function(user) {
for(var x = 0; x < users.length; x++) {
var current = users[x];
if(current.username === user.username && current.password === user.password) {
return true;
}
}
return false;
};
或者,您也可以簡單地使用Linq.js,這對此類查詢有很大幫助。 這是我最喜歡的庫之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.