简体   繁体   English

在过滤器中选择性地返回匹配对象的一部分

[英]Selectively return part of the matched object in filter

How to selectively return only a part of the matched object while iterating through the filter method of the list.如何在遍历列表的 filter 方法时选择性地只返回匹配对象的一部分。

For Eg:例如:

 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 })

here, running filter on comments returns the matched object, but I want to return only list of id在这里,对comments运行过滤器返回匹配的对象,但我只想返回id列表

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

You can use map in your code to achieve this.您可以在代码中使用 map 来实现这一点。 Map 地图

Here is working code.这是工作代码。

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

This will return the array of id which present in the comments.这将返回出现在评论中的 id 数组。

Two solutions:两种解决方案:

Use map after filter过滤后使用地图

 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)

Use reduce使用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 } }, [])


I think first one maybe easy to understand.我认为第一个可能很容易理解。

After is reduce doc: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce之后是减少文档: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

You can use reduce method and check the condition c.status == "ACTIVE" && c.id .您可以使用reduce方法并检查条件c.status == "ACTIVE" && c.id If condition is satisfied, then you can push value into array:如果条件满足,则可以将值推入数组:

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

An example:一个例子:

 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);

You can implement map() with Destructing Assignment :您可以使用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);

I feel that why you are using two different loops for this.我觉得这就是为什么你为此使用两个不同的循环 You can do this by simply used 1 for of loop as example below:您可以通过简单地使用 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)

在此处输入图片说明

If we used filter and map functions then the major drawback is that we iterate the array two times, which has no need.如果我们使用filtermap函数,那么主要的缺点是我们迭代数组两次,这是没有必要的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM