如何使用get函数过滤掉我发现的所有部分

问题描述 投票:0回答:2

这是我正在获取的会话列表,现在我要删除所有会话,除非活动的是true

const token = 'xxxx-xxx-xxxxx-xxxx-xxxxx';

const session_list = [
{
  "id": "45345345-4534-5435-d1cc1bdb6153410",
  "device": "browser",
  "ip": "xx.xx.xxx.xxx",
  "city": null,
  "country": null,
  "browser_name": "Opera",
  "browser_version": "67.0.3575.115",
  "os_name": "Mac OS"
},
{
  "id": "23213-34234-324234-4234324o",
  "device": "browser",
  "ip": "xx.xx.xxx.xxx",
  "city": null,
  "country": null,
  "browser_name": "Mozila",
  "browser_version": "67.0.3575.115",
  "os_name": "Windows"
},
{
  "id": "324234-sadasd34-sdsda343-3434234234",
  "device": "browser",
  "ip": "xx.xx.xxx.xxx",
  "city": null,
  "country": null,
  "browser_name": "Opera",
  "browser_version": "67.0.3575.115",
  "os_name": "android",
  "active": true
}
]

[现在,我想调用一个API来删除会话,现在它包含3件事,令牌是静态的,ipsession_id是我在session_list数组中找到的现在,API通过传递必需的参数来一一删除会话。

  const delete_session_api = async (data) => {
    // delete the session
    try {

        const config = {
            data: querystring.stringify(data),
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
            },
        };

        const { data: api_res } =
            await axios.delete('/sessions/delete', config);

        return api_res;

    } catch (error) {

        throw error;

    }

    };

我全部想从session_list中删除会话,但活动的true会话是相同的列表。有人可以帮助我实现这一目标吗?

javascript node.js express filter
2个回答
0
投票

您可以使用此简短功能在普通JavaScript中进行此操作

const filterActiveSessions = payload => ({
  meta: payload.meta,
  data: (payload.data || []).filter(session => session.active),
})

您还可以使用我的functional编程库rubico编写一个函数来删除非活动会话。我可以将其合并为一个函数,因为我使用该库编写了许多小函数。

const { pipe, fork, filter, get } = rubico

const payload = {
  "meta": {
    "message": "Sessions retrieved successfully."
  },
  "data": [
    {
      "id": "45345345-4534-5435-d1cc1bdb6153410",
      "device": "browser",
      "ip": "xx.xx.xxx.xxx",
      "city": null,
      "country": null,
      "browser_name": "Opera",
      "browser_version": "67.0.3575.115",
      "os_name": "Mac OS"
    },
    {
      "id": "23213-34234-324234-4234324o",
      "device": "browser",
      "ip": "xx.xx.xxx.xxx",
      "city": null,
      "country": null,
      "browser_name": "Mozila",
      "browser_version": "67.0.3575.115",
      "os_name": "Windows"
    },
    {
      "id": "324234-sadasd34-sdsda343-3434234234",
      "device": "browser",
      "ip": "xx.xx.xxx.xxx",
      "city": null,
      "country": null,
      "browser_name": "Opera",
      "browser_version": "67.0.3575.115",
      "os_name": "android",
      "active": true
    }
  ],
}

// payload => payload_with_active_sessions_only
const filterActiveSessions = fork({
  meta: get('meta'),
  data: pipe([
    get('data'),
    filter(session => session.active),
  ]),
})

console.log(
  filterActiveSessions(payload)
)
<script src="https://unpkg.com/rubico/index.js" crossorigin></script>

0
投票

您可以如下直接使用Array.filter()方法。

说,如果您将其作为API响应的一部分,而您正在尝试在成功回调中处理它,并想返回活动的会话:

const activeSessions = response.data.filter(session => session.active);

return response.data.filter(session => session.active);

注意:如果条件适用于多个会话,则结果可能包含多个对象。

请参阅Mozilla开发人员网络Webdocs,以更好地了解Array.filter()。 Link here

UPDATE

有了新的要求,您要首先获取处于非活动状态的会话,并对每个会话进行API调用(一个接一个)以将其删除。

  1. 获取非活动会话的列表。即activenot true]的会话
  2. const inactiveSessionsList = sessions_list.filter(session => !session.active)
    
  1. 有了此列表,您可以按以下方式进行api调用。
  2. inactiveSessionsList.forEach(async (session)=> {
     const payload = {token: token, ip: session.ip, session_id: session.id }
     await delete_session_api(payload);
    })
    

基于inactiveSessionsList中的项目数量,您将触发每个非活动会话的API调用。

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