【问题标题】:searching a multi-dimensional array using javascript使用javascript搜索多维数组
【发布时间】:2020-09-16 16:48:34
【问题描述】:

跟进有关搜索多维数组的问题。 假设您有一个联系人数组:FirstName、LastName、Email()、Mobile#、Work# 等,其中每个联系人对象可以有多个电子邮件。

目标:通过搜索电子邮件字段查找联系人对象。即使用电子邮件地址查找并返回完整的联系人对象,以便我随后可以将联系人对象中的信息显示给用户以进行查看、编辑等。

我一直在研究 find、filter、map... 都很好,但坚持使用任何数组迭代技术的最佳方法和语法,以应用于更复杂的多维数组字段(搜索电子邮件字段) .

顺便说一句,我只是自学了 Javascript(嗯,实际上是网络资源教会了我),如果这是一个补救性的新手问题,请提前道歉......

【问题讨论】:

  • 你能分享一个你试图搜索的数据结构的例子吗?如果不了解数据的结构,很难理解这个问题。
  • 我在 Google Appscript 中编码, // 下面的代码将检索所有用户的联系人 var contacts = ContactsApp.getContacts();返回: Contact [] 一个包含所有用户联系人的数组。数组结构为:developers.google.com/apps-script/reference/contacts/contact 可以想象,一个Contact有几个1:n的关系,比如email、phone等

标签: javascript arrays search multidimensional-array


【解决方案1】:

另一种方法是在Array.prototype.find() 的回调中使用Array.prototype.includes() 来识别具有各自电子邮件数组中给定电子邮件的联系人:

var contacts = [
  {
    firstName: "Bob",
    emails: [ "bob@domain.com", "bobParr@domain2.com"],
  },
  {
    firstName: "Sally",
    emails: [ "sally@domain.com", "sillySal@domain.com"],
  },
  {
    firstName: "Joe",
    emails: [ "joe@domain.com", "mrJoe777@domain.com"],
  },
];

function findContactWithEmail(email) {
  return contacts.find(contact => contact.emails.includes(email));
}

console.log(findContactWithEmail('sillySal@domain.com'));

【讨论】:

    【解决方案2】:

    GAPI 更新

    因此,使用 GAPI 文档,您将需要以下内容:

    function findContactByEmail(contacts, email) {
      return contacts.find(contact => {
        return contact.getEmails().some(contactEmail => {
          return contactEmail.getAddress() === email
        })
      )
    }
    

    此函数将返回在其电子邮件地址列表中找到的第一个包含搜索电子邮件的联系人。


    原答案

    我假设您的数据类似于:

    [
      {
        firstName: "...",
        emails: [ "email1@domain.com", "email2@domain.com", ... ],
        ...
      }, ...
    ]
    

    您需要一个函数,该函数将联系人列表和电子邮件作为输入,并返回包含该电子邮件的第一个联系人对象:

    function findContactByEmail(contacts, email) {
      return contacts.find(contact => {
        return contact.emails.some(contactEmail => contactEmail === email)
      })
    }
    

    【讨论】:

      【解决方案3】:

      再次感谢您的帮助,这很有启发性,让我走上了正确的道路。回顾一下:

      (1) 目标是提高性能,因为 AppsScript 联系人服务平均每个请求大约需要 2 秒。我的应用可以根据用户的选择发出 1 对 n 请求...响应时间在 UI 呈现之间的 15、20、30 秒之间变得无法接受。

      (2) 测试发现构建一个包含 1500 个 gContact 对象的联系人数组平均需要 2 秒。由于 Contacts 数组位于内存中,因此每个查找请求的查找请求平均低于 0.5 秒。

      下面是有效的 conde。再次感谢您帮助这个编程新手!

      /* Find gContacts that match emails extracted (xEmails) from Gmail messages, Calendar events, shared Drive documents. xEmails is an array of emails addresses name@domain.com.
         @param {string[]} emails | @return {Object[]} contact */
      
      function findContacts(xEmails) { Logger.log('findContacts BEGIN');
        return xEmails.map(findContactByEmail).filter(function(gContact) {
          return gContact != null
        });
      }
      function findContactByEmail(xEmail) { Logger.log('findContactByEmail BEGIN', xEmail);
        return gContacts.find(contact => {
          return contact.getEmails().some(contactEmail => {
            return contactEmail.getAddress() === xEmail
          })
        })
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-03
        • 2011-07-05
        • 2011-11-29
        • 2011-06-26
        • 2014-06-27
        • 1970-01-01
        相关资源
        最近更新 更多