场景:每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)