如何在迭代列表的筛选方法时有选择地仅返回匹配对象的一部分。
例如:
let comments = [{
"postId": 6,
"status": "ACTIVE",
"id": 28,
"name": "quo voluptates voluptas nisi veritatis dignissimos dolores ut officiis",
"email": "[email protected]",
"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": "[email protected]",
"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
的列表
comments.filter((ob, i) => {
return ob.status == "ACTIVE" && ob.id
}).map(({id}) => id)
两种解决方案:
let comments = [{
"postId": 6,
"status": "ACTIVE",
"id": 28,
"name": "quo voluptates voluptas nisi veritatis dignissimos dolores ut officiis",
"email": "[email protected]",
"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": "[email protected]",
"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": "[email protected]",
"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": "[email protected]",
"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
}
}, [])
我认为第一个也许很容易理解。
还原后文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
您可以用map()
实现map()
:
您可以使用let comments = [{
"postId": 6,
"status": "ACTIVE",
"id": 28,
"name": "quo voluptates voluptas nisi veritatis dignissimos dolores ut officiis",
"email": "[email protected]",
"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": "[email protected]",
"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);
方法并检查条件reduce
。如果满足条件,则可以将值推入数组:
c.status == "ACTIVE" && c.id
示例:
const result = comments.reduce((a, c)=> {
if (c.status == "ACTIVE" && c.id)
a.push(c.id);
return a;
}, [])
我觉得你为什么要使用两个不同的循环。您可以通过简单地使用1 let comments = [{
"postId": 6,
"status": "ACTIVE",
"id": 28,
"name": "quo voluptates voluptas nisi veritatis dignissimos dolores ut officiis",
"email": "[email protected]",
"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": "[email protected]",
"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);
循环来完成此操作,如下例所示:
for of
let comments = [{
"postId": 6,
"status": "ACTIVE",
"id": 28,
"name": "quo voluptates voluptas nisi veritatis dignissimos dolores ut officiis",
"email": "[email protected]",
"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": "[email protected]",
"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)