[英]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)
Two solutions:两种解决方案:
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
使用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.如果我们使用filter
和map
函数,那么主要的缺点是我们迭代数组两次,这是没有必要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.