我正在运行JSON服务器来创建简单的登录系统。来自服务器的数据如下所示:
{
"users": [
{
"name": "user1",
"password": "pass1",
"email": "useer1@user.com",
"id": 2,
"details": {
"first_name": "user1_1",
"last_name": "user1_2",
"gender": "male",
"pic": "",
"about": "fnbewhbdwie"
}
},
{
"name": "user2",
"password": "pass2",
"email": "user2@user.com",
"details": {
"first_name": "user2_1",
"last_name": "user2_2",
"gender": "male",
"pic": "",
"about": "cjkdbvcwvebxcnoewbvcu"
},
"id": 4
}
]
}
我创建了一个函数来检查用户输入中的名称和密码是否匹配,并且如果条件为真,我想运行另一个函数,该函数将仅返回具有名称和密码的对象的详细信息。用户输入。
我尝试过find()方法,但它仅返回第一个对象的详细信息
async getAcc() {
const {data} = await Axios
.get(`${BASE_URL}users`)
data.forEach(({name, password}) => {
if(this.nameInput.value === name && this.passInput.value === password){
showAcc();
}
else {
return false
}
}
)
function showAcc() {
let result = data.find(a => a.details)
console.log(result)
}
}
答案 0 :(得分:0)
我会使用lodash过滤器方法而不是查找方法。
类似的东西:_.filter(data,{'name':'user2','password':'pass2'});
它应该为您提供所有符合您在参数对象中传递的条件的对象,如上所示。
答案 1 :(得分:0)
抛弃用户/ pwd在响应上的明显问题,正如评论中提到的那样,我相信这是错误的:
首先,您的数据是对象数组。 因此,根据定义,“查找”将返回lamba函数成功满足的第一个条目。在这种情况下,您要将数组传递到查找中,然后说给我查找的第一个detail对象。它做对了。
我相信您的问题就在前面。由于您将name和pwd添加为参数,因此只为数组中的每个项目选择了那些属性。尝试将其更改为
.forEach(item => {,
会将完整的对象发送到lamba函数。然后,在方法内部,您将需要修改和使用
if(this.nameInput.value === item.name
最后,在if语句中,您甚至可以通过直接将“ details”属性发送到类似以下方法中来简化showAcc:
showAcc(item.details);
和
function showAcc(details) {
console.log(details);
}
如果您有一个我们可以编辑的样本会更好,但是我认为这应该可行。
祝你好运
答案 2 :(得分:0)
WebDever可能已为您提供了更好的解决方案。我只是指出我的观察,它直接解释了为什么您无法打印所有答案。
我对所使用的任何技术一无所知,但问题似乎出在forEach内部代码块的返回值(或缺少返回值)。它看起来只是显示结果,就其本身而言,在停止迭代方面应该没有副作用。因此,当您首次找到匹配项时,发生的关键事情是您不返回“ false”。到目前为止,您一直在返回“ false”。
所以我的猜测是,当您找到匹配项时,您将返回最后一个表达式的结果,而不是'false',并且该返回值会导致迭代停止。因此,将foreach中的代码更改为:
if(this.nameInput.value === name && this.passInput.value === password){
showAcc();
}
return false