【问题标题】:Simplify nested for loop简化嵌套 for 循环
【发布时间】:2020-11-16 20:04:12
【问题描述】:

我有这个代码:

let peopleInRoom = [];
  for (let message of messages) {
    for (let email of message.user.email) {
      if (!peopleInRoom.includes(email)) {
        peopleInRoom.push(email);
      }
    }
  }

  let peopleInRoomElement = peopleInRoom.map(person => (
    <li>{person}</li>
  ))

基本上我正在尝试获取所有独特的电子邮件并显示它们。

是否有更短更高效的方式(可能是一些 ES6 特性)来编写相同的代码?看起来代码太多了。

我看了这个答案:How to get distinct values from an array of objects in JavaScript?

编辑:上面的代码没有做我想要的。

我的数据如下所示:

[
   {
     text: 'foo',
     user: { email: 'foo@bar.com', password: 'foo' }
   },
   {
     text: 'baz',
     user: { email: 'baz@qux.com', password: 'baz' }
   }
]

对象都是消息。我想从每条消息中获取所有唯一电子邮件的数组

【问题讨论】:

  • 你试过一套吗?
  • 您好,欢迎来到 SO!如果您想要单线,您找到的答案绝对是要走的路,只需稍作修改即可在您的情况下使用。如果它不起作用 - 你确定你了解它应该如何工作吗?如果不是,那么您当前的尝试可能会更好,只是您没有正确处理您的数据 - message.user.email 是一个字符串,而不是一个数组。

标签: javascript reactjs performance for-loop


【解决方案1】:

您可以使用内置于 JavaScript 中的 Set 对象。 Set 对象实际上保留了不同的原始值。

const messages = [
   {
     text: 'foo',
     user: { email: 'foo@bar.com', password: 'foo' }
   },
   {
     text: 'baz',
     user: { email: 'baz@qux.com', password: 'baz' }
   }
]

const peopleInRoom = [...new Set(messages.map(message => message.user.email))];

它实际上从每条消息中提取电子邮件,然后将其传递给 Set 对象,该对象只保留唯一的电子邮件集。之后,它将将该 Set 传播到数组中,因为 Set 也是一个可迭代对象,并返回房间中人员的数组。

【讨论】:

    【解决方案2】:

    如果我理解正确,人们有消息,消息有电子邮件地址,并且 OP 寻求唯一的电子邮件地址集。如果这就是所有可用数据,那么别无选择,只能对其进行迭代,检查是否已收集每封电子邮件,如果尚未收集,则收集它。

    有一些方法可以通过在库代码中隐藏这项工作。可能最高级别的实用程序是lodash's _.uniqueBy,但工作必须以一种或另一种方式完成。

    【讨论】:

      【解决方案3】:

      Set object 强制其元素的唯一性。你可以这样使用它:

      const peopleInRoom = Array.from(new Set(messages.map(message => message.user.email)));
      

      【讨论】:

        【解决方案4】:

        首先,您可以创建一个包含所有电子邮件地址的数组:

        const data = [
           {
             text: 'foo',
             user: { email: 'foo@bar.com', password: 'foo' }
           },
           {
             text: 'baz',
             user: { email: 'baz@qux.com', password: 'baz' }
           }
        ]
        
        const emailArray = data.map((elem) => {
          return elem.user.email;
        }
        

        然后您可以将它们过滤为唯一:

        function onlyUnique(value, index, self) {
          return self.indexOf(value) === index;
        }
        
        
        emailArrayFiltered = emailArray.filter(onlyUnique);
        

        请参阅此处查看参考文献link

        【讨论】:

          【解决方案5】:

          怎么样:

          const peopleInRoom = messages.map(e => e.user.email && e.user.email);
          console.log(peopleInRoom)
          

          给你这个输出:

          ["foo@bar.com", "baz@qux.com"]
          

          【讨论】:

            猜你喜欢
            • 2022-01-26
            • 1970-01-01
            • 1970-01-01
            • 2012-06-23
            • 1970-01-01
            • 2015-01-15
            • 2020-01-14
            • 2020-08-24
            • 2020-07-06
            相关资源
            最近更新 更多