我如何从一个特定的对象返回值?

时间:2019-02-09 21:34:03

标签: javascript json reactjs

我正在运行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)
  }
}

3 个答案:

答案 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