JavaScript开发过程中一个小需求

场景:每1000ms都发送get请求来获取json,获取的数据是一个数组有若干不固定数量的对象,每个对象有一个id,类似:[ { id:"1" },{id:"2" },{ id:"3" } ] ;json数据是动态添加删除的:例如 id=1的对象随时会被删除,添加进比如id=5,id=7,id=10的对象。

需求1:在请求到json后,打印出id,但同一个id只打印一次,比如json中包含id=1和id=2的对象时,不管再请求多少次get请求,也只打印一次 id=1和一次 id=2。json中出现新id的对象时同理,
需求2:当已经出现过的id,比如id=1的对象被删除时,再打印一次id,拼接'已删除'类似字符串加以区分。

代码结构大致如下:

            setInterval(() => {
                request({
                    url: "subway/monitor/allrunning",
                }).then((res) => {
                        for(var i=0;i<res.length;i++){
                            console.log(res[i].id)
              }});}, 1000)   

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
实现您的需求,可以使用一个数组来存储已经打印过的 id 值,每次获取到新的 json 数据时,遍历其中的对象,判断其 id 是否已经在数组中存在,如果不存在则打印 id,并将其添加到数组中;如果存在则不打印。当从 json 数据中移除某个 id 时,再次打印该 id 并添加 "已删除" 字符串。

下面是一个示例代码:

let printedIds = []; // 存储已经打印过的 id

setInterval(() => {
  request({
    url: "subway/monitor/allrunning",
  }).then((res) => {
    for (let i = 0; i < res.length; i++) {
      let id = res[i].id;

      if (!printedIds.includes(id)) {
        console.log(id);
        printedIds.push(id);
      }
    }

    // 判断哪些 id 已经被删除
    for (let i = 0; i < printedIds.length; i++) {
      let id = printedIds[i];
      let found = res.find((item) => item.id === id);

      if (!found) {
        console.log(id + " 已删除");
        printedIds.splice(i, 1);
        i--; // 注意:删除元素后需要将索引减一,以免跳过下一个元素
      }
    }
  });
}, 1000);

在这个示例代码中,printedIds 数组存储已经打印过的 id 值。每次获取到新的 json 数据时,遍历其中的对象,判断其 id 是否已经在数组中存在,如果不存在则打印 id,并将其添加到数组中;如果存在则不打印。在遍历完 json 数据后,再次遍历 printedIds 数组,判断哪些 id 已经被删除,如果已经被删除则打印其 id 并添加 "已删除" 字符串,并将其从数组中删除。

需要注意的是,数组的删除操作可能会导致索引发生变化,因此在删除元素后需要将索引减一,以免跳过下一个元素。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢


let ids = {}; // 用一个对象记录已经打印过的id
setInterval(() => {
  request({
    url: "subway/monitor/allrunning",
  }).then((res) => {
    for (var i = 0; i < res.length; i++) {
      if (!ids[res[i].id]) { // 如果之前没有打印过该id,打印出来,并记录
        console.log(res[i].id);
        ids[res[i].id] = true;
      }
    }
    // 检查是否有被删除的id,如果有,再次打印并加上"已删除"
    for (const id in ids) {
      if (!res.some(obj => obj.id === id)) {
        console.log(id + ' 已删除');
      }
    }
  });
}, 1000)