javascript - 当两个数组之间找到匹配项时停止迭代并返回 true

标签 javascript arrays indexeddb pouchdb

我有两个数据集,一个在indexedDB中,一个在PouchDB中(是的,我知道PouchDB是indexedDB的一种实现)。

indexedDB中的是房间列表,通过上一页存储在indexedDB中,并显示在当前页面上。

PouchDB 中的是房间审计员记录的房间使用日志。我想遍历第一个列表,并检查每个项目是否出现在已审核房间的列表中。如果它确实出现,我想设置一个标志来表明这一点。

这是我的 JavaScript。 (我已经在浏览器中运行了它,它确实在该过程中的某个时刻返回 true,因为控制台日志输出显示了这一点,但该标志并未针对列表项设置。)

我想知道它是否继续循环审核记录并覆盖“true”值?

这是查询indexedDB的函数,并调用查询PouchDB的函数:

function getRoomsInRoute() {
    var routeNumber = $.jStorage.get('currentRoute', '');
    var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB;

    openRequest = window.indexedDB.open("rooms", 1);
    openRequest.onupgradeneeded = function() {
        var db = openRequest.result;
        var itemStore = db.createObjectStore("rooms", {keyPath: "room_id"});
        var index = itemStore.createIndex("rooms", ["route_number"]);
    };

    openRequest.onerror = function(event) {
        console.error(event);
    };

    openRequest.onsuccess = function (event) {
        var db = openRequest.result;
        db.onerror = function(event) {
            // Generic error handler for all errors targeted at this database's requests
            console.error(event.target);
            console.log("Database error: " + event.target.error.name || event.target.error || event.target.errorCode);
        };
        var transaction = db.transaction(['rooms'], "readwrite");
        var itemStore = transaction.objectStore("rooms");
        var index = itemStore.index("rooms", ["route_number"]);
        console.log('DB opened');
        var intRouteNumber = parseInt(routeNumber);
        //var range = IDBKeyRange.only(intRouteNumber);

        itemStore.openCursor().onsuccess = function(event) {
            var cursor = event.target.result;
            if(cursor) {
                var audited;
                if(cursor.value.route_number == routeNumber) {
                    if (checkIfAudited(cursor.value.room_seq)) {
                        var audited = ' <span class="checked"><i class="fa fa-check"></i></span>';
                    } else {
                        var audited = "";
                    }
                    $('#mylist').append("<li id="+ cursor.value.room_id +" rel="+ cursor.value.room_seq +"> " + '<small>'+ cursor.value.room_seq + '.&nbsp;</small><a href="/static?action=edit&amp;room_id='+ cursor.value.room_id +'&amp;route_number='+ cursor.value.route_number +'&amp;sequence='+ cursor.value.room_seq +'&amp;roomname='+ cursor.value.room_name +'&amp;capacity='+ cursor.value.room_capacity +'">' + cursor.value.room_name + '</a>'+audited+'</li> ');
                }

                cursor.continue();
            } else {
                console.log('Entries all displayed.');
                if(!($.jStorage.get('reverseroute', ''))) {
                    reverseroute = 'asc';

                } else {
                    reverseroute = $.jStorage.get('reverseroute', '');
                }
                appendHref(reverseroute);
            }
        };

        // Close the db when the transaction is done
        transaction.oncomplete = function() {
            db.close();
        };
    };
}

这是查询 PouchDB 以查看它是否已被审核的函数:

function checkIfAudited(roomseq) {
    var today = new Date();
    if(is_BST(today) == true) {
        var currentHour = today.getHours()+1;
    } else {
        var currentHour = today.getHours();
    }
    var currentDay = today.getDate();
    var currentMonth = today.getMonth();

    options = {},
    that = this,
    pdb = new PouchDB('pouchroomusage');
    options.include_docs = true;
    var pouchOpts = {
      skipSetup: true
    };
    var opts = {live: true};

    pdb.allDocs(options, function (error, response) {
        response.rows.some(function(row){
            var auditTime = new Date(row.doc.timestamp);
            var auditHour = auditTime.getUTCHours();
            var auditDay = auditTime.getDate();
            var auditMonth = auditTime.getMonth();
            if(row.doc.sequence == roomseq && currentHour == auditHour && currentDay == auditDay && currentMonth == auditMonth) {
                var isAudited = true;   
                console.log('RoomSeq: ' + roomseq + '; auditHour: ' + auditHour + '; currentHour: ' + currentHour + '; auditDay: ' + auditDay); 
                console.log('currentDay: ' + currentDay + '; auditMonth: ' + auditMonth + '; currentMonth: ' + currentMonth + '; isAudited: ' + isAudited);
            } else {
                var isAudited = false;
                console.log('No matches');
            }
            return isAudited;
        });
    });
}

我已经阅读了许多有关比较两个数组的其他问题和答案。

我不知道如何将 for 循环与 pdb.allDocs 一起使用:(

这是 console.log 的输出:

49 No matches

RoomSeq: 1; auditHour: 14; currentHour: 14; auditDay: 16 currentDay: 16; auditMonth: 0; currentMonth: 0; isAudited: true

2300 No matches

那么当第二个函数命中 PouchDB 中的匹配记录时,如何让第二个函数停止并返回 true?

最佳答案

首先,我不太喜欢利用 Array.prototype.some 的短路行为。使用您可用的 native 功能。 indexedDB 提供了一种内置方法来停止前进游标,或仅从存储中加载有限数量的对象。

其次,当您只对其中一些对象感兴趣时,您可能希望避免从存储中加载所有对象。使用光标在商店中行走。由于您似乎希望在满足某些条件时停止迭代,因此此时不要调用cursor.continue。

第三,即使决定首先从存储中加载所有对象,使用 for 循环也比利用 some 好得多。我所说的利用是指以非预期的方式使用该函数。我敢打赌,如果您恢复使用带有break语句的for循环,代码将会更清晰,因此会更容易理解为什么循环在您期望它这样做时不会中断。

第四,我会花时间将 indexedDB 查询的结果附加到中间数据结构(如数组),而不是立即与 DOM 交互。它将更加分离事物,并且您会发现代码更易于调试。

第五,将异步调用与 indexedDB 混合在一起时应该非常小心。众所周知,当您交错调用其他 Promise 时,indexedDB 会出现问题。

关于javascript - 当两个数组之间找到匹配项时停止迭代并返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48283579/

相关文章:

javascript - 基本 Javascript/jQuery 数学游戏 : Why can't I evaluate the second time I run this function?

javascript - 使用自定义头像组件时出现 Material UI v0 ListItem 对齐问题

java - 检测数组中的重复项

javascript - 如何在 javascript-vuejs 中将两个函数的总和放入数组中

indexeddb - 序列成员的字符串化

javascript - IDBFactory.onsuccess 与 IDBFactory.oncomplete

javascript - D3水平堆叠条形图添加和删除数据

javascript - 路由器应该负责网络请求吗? ( Backbone .js)

python - 在 python 中使用 h5py 调整数据集大小并以 .h5 格式存储数据集

google-chrome - Chrome StorageManager API 报告配额远大于预期