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

问题描述 投票:1回答:6

如何在迭代列表的筛选方法时有选择地仅返回匹配对象的一部分。

例如:

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的列表

javascript arrays for-loop ecmascript-5
6个回答
3
投票
comments.filter((ob, i) => {
  return ob.status == "ACTIVE" && ob.id
}).map(({id}) => id)

2
投票

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

这里是工作代码。

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

这将返回出现在注释中的ID数组。


2
投票

两种解决方案:

过滤后使用地图

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


1
投票

您可以用map()实现map()


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" } ]; 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;
}, [])

0
投票

我觉得你为什么要使用两个不同的循环。您可以通过简单地使用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)

如果使用enter image description herefilter函数,则主要缺点是我们将数组迭代两次,这是不必要的。

© www.soinside.com 2019 - 2024. All rights reserved.