簡體   English   中英

在JS中如何檢查對象數組是否包含一個對象?

[英]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,這對此類查詢有很大幫助。 這是我最喜歡的庫之一。

https://linqjs.codeplex.com/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM