【问题标题】:Count where for an indexedDB database计算 indexedDB 数据库的位置
【发布时间】:2019-01-04 05:55:06
【问题描述】:

我将日期存储在 indexedDB 数据库中,我想计算 2018 年、2017 年等发生的记录数并将它们打印在表格中。我遇到的问题是我不确定如何根据以前的记录检查日期以干净地计算它们。它相当于一个 count where function is SQL。

起初,我有类似的东西,但我不确定它是否会起作用。日期的存储方式像“2018 年 1 月 5 日星期三”,因此使用了 Slice() 方法。

        var cursor = event.target.result;

        //2016
        firstPostYear = cursor.value.date.slice(-4);
        alert(firstPostYear);
        var count = 0;

        if (cursor)
        {
            if (cursor.value.date.slice(-4) === firstPostYear)
            {
                count += 1;
            }
            else
            {
                console.log(count);
                count = 0;
                firstPostYear = cursor.value.date.slice(-4)
            }

            cursor.continue()
        }

如果有人能告诉我一个更简单的方法来做到这一点,我将不胜感激。

这是给瑞恩的:

function filterSelection(filter) 
{
    var objectStore = db.transaction('posts').objectStore('posts');

objectStore.openCursor().onsuccess = function (event) 
{
    var cursor = event.target.result;

    if (filter === "all")
    {    
        //Get the number of all time posts
        var transaction = db.transaction(['posts'], 'readonly');
        var objectStore = transaction.objectStore('posts');

        var countRequest = objectStore.count();
        countRequest.onsuccess = function() 
        {
            // Get table element
            var table = document.getElementById("activityLog");
            //Get table length
            var rowCount = table.rows.length;
            // Create a table row
            var row = table.insertRow(rowCount);

            // Insert new cells positions 1-5 of the "new" <tr> element:
            var cell1 = row.insertCell(0);
            var cell2 = row.insertCell(1);

            // Add some text to the new cells:
            cell1.innerHTML = "All time";
            cell2.innerHTML = countRequest.result;
        }

    }

    else if (filter === "Years")
    {
        //Get the number of posts each year
        var cursor = event.target.result;

        var counts = {};

        if (cursor) 
        {
            const year = cursor.value.date.slice(-4);

            if ( !(year in counts) ) 
            {
                counts[year] = 0;
            }
            (counts[year]) + 1;
            alert(counts[year]);

            cursor.continue();

        }
        else
        {

        }

    }

【问题讨论】:

    标签: javascript local-storage indexeddb


    【解决方案1】:

    所以我不完全知道保存这些数据的对象存储是什么样的,所以我可能会对它以及你在做什么做出一些假设。

    首先,有一种比打开光标并遍历整个商店更好的方法来做您正在做的事情。如果您可以完全重构您的数据,您可以创建一个存储对象年份的字段,在该字段上创建一个索引,然后基本上执行&lt;ObjectStoreReference&gt;.index('year').count() 以非常快速地获取所有文档。

    但如果你不能,那么你需要这样做。但是,您现在使用游标方法跟踪信息的方式不会让您打印出表格中的所有内容,因为每次您从cursor.value.date.slice(-4) 生成的年份从您的firstPostYear 更改时,您都会清除计数。

    你可以尝试做类似的事情

    const counts = {};
    
    if (cursor) {
        const year = cursor.value.date.slice(-4);
        if ( !(year in counts) ) {
            counts[year] = 0;
        }
        counts[year]++;
        cursor.continue();
    }
    

    然后您可以遍历对象中的条目,并根据需要打印出每年及其计数。

    【讨论】:

    • 感谢您的回复。我不想改变数据结构。在您的示例中,当我在递增后提醒计数时,我得到的值为 0。无论有多少记录具有相同的年份
    • 你能分享你的代码(内联或 Gist/JSFiddle 等)吗?我认为问题可能是您在打开光标的onsuccess 处理程序内初始化counts,在这种情况下cursor.continue() 在每次连续迭代时重新初始化它。您可能需要创建比成功处理程序高一级的counts = {}
    • 我已将其添加到我的问题底部
    • 是的,我认为问题出在这一行:(counts[year]) + 1; 您只是将counts[year] 中包含的数字加到1,而不是将结果分配给任何地方。如果将其更改为 counts[year] += 1 会发生什么?
    • 是的。我应该注意到那个。当前数据是 2017、2017、2018、2018。这意味着警报应该是 1、2、1、2,但我得到的结果是 1、1、1、1。我猜这意味着 if 语句不是不工作?
    猜你喜欢
    • 2020-04-12
    • 2012-05-25
    • 1970-01-01
    • 2017-03-16
    • 2019-09-30
    • 2015-08-24
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多