【问题标题】:Selectively return part of the matched object in filter在过滤器中选择性地返回部分匹配对象
【发布时间】:2020-01-13 09:39:20
【问题描述】:

在遍历列表的过滤方法时,如何选择性地只返回匹配对象的一部分。

例如:

let comments = [{
    "postId": 6,
    "status": "ACTIVE",
    "id": 28,
    "name": "quo voluptates voluptas nisi veritatis dignissimos dolores ut officiis",
    "email": "Ronny@rosina.org",
    "body": "voluptatem repellendus quo alias at laudantium\nmollitia quidem esse\ntemporibus consequuntur vitae rerum illum\nid corporis sit id"
  },
  {
    "postId": 6,
    "id": 29,
    "status": "INACTIVE",
    "name": "eum distinctio amet dolor",
    "email": "Jennings_Pouros@erica.biz",
    "body": "tempora voluptatem est\nmagnam distinctio autem est dolorem\net ipsa molestiae odit rerum itaque corporis nihil nam\neaque rerum error"
  }
];

comments.filter((ob, i) => {
  return ob.status == "ACTIVE" && ob.id
})

在这里,在comments 上运行过滤器会返回匹配的对象,但我只想返回id 的列表

【问题讨论】:

  • 你可以map结果..
  • 或者.. 使用reduce 进行单循环。

标签: javascript arrays for-loop ecmascript-5


【解决方案1】:
comments.filter((ob, i) => {
  return ob.status == "ACTIVE" && ob.id
}).map(({id}) => id)

【讨论】:

  • 谢谢,但是有没有办法在 fitler 本身中格式化所需数据,而不是使用 map 再次迭代?
  • @VigneshSharma 只有在减少而不是过滤器时才有可能。基于过滤条件。如果您无论如何都使用过滤器,那么您正在迭代一个数组。然后只返回 id 部分,您将不得不再次遍历过滤的项目。
  • 所以@VigneshSharma 这里 reduce 是你的救星,这里有很多人回答。
【解决方案2】:

您可以在代码中使用 map 来实现此目的。 Map

这是工作代码。

comments.map(function (data) {
  return data.id
});

这将返回存在于 cmets 中的 id 数组。

【讨论】:

    【解决方案3】:

    两种解决方案:

    过滤后使用地图

    let comments = [{
        "postId": 6,
        "status": "ACTIVE",
        "id": 28,
        "name": "quo voluptates voluptas nisi veritatis dignissimos dolores ut officiis",
        "email": "Ronny@rosina.org",
        "body": "voluptatem repellendus quo alias at laudantium\nmollitia quidem esse\ntemporibus consequuntur vitae rerum illum\nid corporis sit id"
      },
      {
        "postId": 6,
        "id": 29,
        "status": "INACTIVE",
        "name": "eum distinctio amet dolor",
        "email": "Jennings_Pouros@erica.biz",
        "body": "tempora voluptatem est\nmagnam distinctio autem est dolorem\net ipsa molestiae odit rerum itaque corporis nihil nam\neaque rerum error"
      }
    ];
    
    const arr = comments.filter((ob, i) => {
      return ob.status == "ACTIVE"
    }).map(ob => ob.id)

    使用reduce

    let comments = [{
        "postId": 6,
        "status": "ACTIVE",
        "id": 28,
        "name": "quo voluptates voluptas nisi veritatis dignissimos dolores ut officiis",
        "email": "Ronny@rosina.org",
        "body": "voluptatem repellendus quo alias at laudantium\nmollitia quidem esse\ntemporibus consequuntur vitae rerum illum\nid corporis sit id"
      },
      {
        "postId": 6,
        "id": 29,
        "status": "INACTIVE",
        "name": "eum distinctio amet dolor",
        "email": "Jennings_Pouros@erica.biz",
        "body": "tempora voluptatem est\nmagnam distinctio autem est dolorem\net ipsa molestiae odit rerum itaque corporis nihil nam\neaque rerum error"
      }
    ];
    
    const res = comments.reduce((pre, cur) => {
      if (cur.status === "ACTIVE") {
        return [...pre, cur.id]
      } else {
        return pre
      }
    }, [])

    我认为第一个可能很容易理解。

    之后是reduce doc:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

    【讨论】:

      【解决方案4】:

      你可以用Destructing Assignment实现map()

      let comments = [{
          "postId": 6,
          "status": "ACTIVE",
          "id": 28,
          "name": "quo voluptates voluptas nisi veritatis dignissimos dolores ut officiis",
          "email": "Ronny@rosina.org",
          "body": "voluptatem repellendus quo alias at laudantium\nmollitia quidem esse\ntemporibus consequuntur vitae rerum illum\nid corporis sit id"
        },
        {
          "postId": 6,
          "id": 29,
          "status": "INACTIVE",
          "name": "eum distinctio amet dolor",
          "email": "Jennings_Pouros@erica.biz",
          "body": "tempora voluptatem est\nmagnam distinctio autem est dolorem\net ipsa molestiae odit rerum itaque corporis nihil nam\neaque rerum error"
        }
      ];
      
      comments = comments.filter((ob, i) => {
        return ob.status == "ACTIVE" && ob.id
      }).map(({id}) => ({id}));
      
      console.log(comments);

      【讨论】:

        【解决方案5】:

        您可以使用reduce 方法并检查条件c.status == "ACTIVE" && c.id。如果满足条件,则可以将值压入数组:

        const result = comments.reduce((a, c)=> {
           if (c.status == "ACTIVE" && c.id)
               a.push(c.id);
           return a;
        }, [])
        

        一个例子:

        let comments = [{
          "postId": 6,
          "status": "ACTIVE",
          "id": 28,
          "name": "quo voluptates voluptas nisi veritatis dignissimos dolores ut officiis",
          "email": "Ronny@rosina.org",
          "body": "voluptatem repellendus quo alias at laudantium\nmollitia quidem esse\ntemporibus consequuntur vitae rerum illum\nid corporis sit id"
        },
        {
          "postId": 6,
          "id": 29,
          "status": "INACTIVE",
          "name": "eum distinctio amet dolor",
          "email": "Jennings_Pouros@erica.biz",
          "body": "tempora voluptatem est\nmagnam distinctio autem est dolorem\net ipsa molestiae odit rerum itaque corporis nihil nam\neaque rerum error"
        }
        ];
        
        const result = comments.reduce((a, c)=> {
          if (c.status == "ACTIVE" && c.id)
            a.push(c.id);
          return a;
          }, [])
        
        console.log(result);

        【讨论】:

          【解决方案6】:

          我觉得您为什么要为此使用两个不同的循环。您可以通过简单地使用 1 for of 循环来做到这一点,如下例所示:

          let comments = [{
              "postId": 6,
              "status": "ACTIVE",
              "id": 28,
              "name": "quo voluptates voluptas nisi veritatis dignissimos dolores ut officiis",
              "email": "Ronny@rosina.org",
              "body": "voluptatem repellendus quo alias at laudantium\nmollitia quidem esse\ntemporibus consequuntur vitae rerum illum\nid corporis sit id"
            },
            {
              "postId": 6,
              "id": 29,
              "status": "INACTIVE",
              "name": "eum distinctio amet dolor",
              "email": "Jennings_Pouros@erica.biz",
              "body": "tempora voluptatem est\nmagnam distinctio autem est dolorem\net ipsa molestiae odit rerum itaque corporis nihil nam\neaque rerum error"
            }
          ];
          
          const matchedCommentsIds = []
          for (const {status, id}of comments) {
          
            if (status == "ACTIVE" && id){
              matchedCommentsIds.push(id)
            }
          }
          
          console.log(matchedCommentsIds)
          

          如果我们使用filtermap 函数,那么主要的缺点是我们需要对数组进行两次迭代,这没有必要。

          【讨论】:

            猜你喜欢
            • 2017-06-21
            • 2012-07-22
            • 2017-12-06
            • 2022-09-12
            • 1970-01-01
            • 2016-10-13
            • 1970-01-01
            • 2019-09-19
            • 2015-09-20
            相关资源
            最近更新 更多