首页 > 解决方案 > 检查深层嵌套对象数组中的条件并返回父数组

问题描述

我在 React Native (Expo) 项目中遇到了 JavaScript 问题。

描述:

我正在使用联系人 API 从手机中获取所有联系人。我想过滤列表并仅呈现应用程序数据库中也包含号码的联系人(注册电话)。

问题:

我想遍历对象数组并在嵌套对象(phoneNumbers)中找到要与用户号码进行比较的号码。如果条件正确,那么我想使用父数组作为联系方式。

这是父数组中一个对象的数据结构:

     contacts =  [
          Object {
            "contactType": "person",
            "firstName": "Mario",
            "id": "FF1AAC7C-679A-4C21-7AD9-05CBFCD9812A",
            "imageAvailable": false,
            "lastName": "Mario",
            "name": "Muster",
            "phoneNumbers": Array [
            Object {
               "countryCode": "de",
               "digits": "01722618199",
               "id": "D5CEEE9B-1AF6-49A1-A45F-501370D5B7A7",
               "label": "mobile",
               "number": "0172 2618199",
               },
             ],
          }, 
          Object {
             "contactType": "person",
             "firstName": "Tina",
             "id": "FF1AAC7C-579A-4C21-7AD9-05CBFCD9812A",
             "imageAvailable": false,
             "lastName": "Mario",
             "name": "Muster",
             "phoneNumbers": Array [
             Object {
                "countryCode": "de",
                "digits": "01722518199",
                "id": "D5CEEE9B-1AF5-49A1-A45F-501370D5B7A7",
                "label": "mobile",
                "number": "0172 2518199",
                },
             ],
          }, 
        ]

我的功能:

    const findContacts = (userNumber) => {
    let counter = 0;
    contacts
      .filter((item) => {
        return item;
      })
      .map((item) => {
        let newElt = Object.assign({}, item);
        return newElt.phoneNumbers.map((item, i) => {
          if (item.digits.toString() === userNumber) {
            counter = i;
          }
        });
      });
    return contacts[counter];
  };

收到以下错误:

undefined 不是对象newElt.phoneNumber.map

标签: javascriptjavascript-objects

解决方案


错误实际上是“newElt.phoneNumber.map”,数字中没有“s”吗?如果是这样,则有些可疑,因为您没有在函数粘贴中拼错它。

此外,您的“过滤器”可能没有按照您的意愿行事。过滤器应该返回真/假,并且只包括返回“真”的项目。

您真正想要做的可能只是使用 .filter 然后为 phoneNumbers 包含您想要的每个项目返回“True”......

即这样的事情会给你所有与相关电话号码匹配的父数组联系人对象(在其子数组成员中至少有一个提及)

let contactsThatHadPhoneNumber = contacts.filter(eachContact => {
  return eachContact.phoneNumbers.filter(
    eachContactNumber => eachContactNumber.number == numberYouAreLookingFor).length > 0
  )});

推荐阅读