【问题标题】:How to stop Chrome and Firefox from sorting sessionStorage by key alphabetically?如何阻止 Chrome 和 Firefox 按字母顺序对 sessionStorage 进行排序?
【发布时间】:2020-08-18 22:51:54
【问题描述】:

我有一个 JS 脚本,可以将 (sessionStorage.setItem()) 和删除 (sessionStorage.removeItem()) 项目添加到 sessionStorage。它的工作原理是添加一个项目会将其附加到 sessionStorage 数组的末尾。它在 Edge 中按预期工作,但在 Chrome 和 Firefox 中进行测试时,在向 sessionStorage 添加项目后,sessionStorage 会按字母顺序按键重新排序,这意味着添加的最后一项不会位于数组的末尾,这会破坏整个脚本.我该如何防止这种情况? 这是向 sessionStorage 添加项目的函数:

function addToCompareList(productName, productID, productHref) {
        var existsInCompare = false;
        for(var i = 0; i < sessionStorage.length; i++) {
            if(sessionStorage.key(i) == productName) {
                existsInCompare = true;
                break;
            }
        }
        if(!existsInCompare) {
            sessionStorage.setItem(productName, productID + ',' + productHref);
        }
        //item limit should be 4, so if storage exceeds limit, remove oldest item. This is the part that becomes faulty in some browsers
        if(sessionStorage.length > 4) {
            sessionStorage.removeItem(sessionStorage.key(0));
        }
    }

这是向 sessionStorage 添加项目的函数的代码。

添加项目后,通过会话存储和 console.log()-ing 循环每个项目在不同浏览器中的工作方式不同:在 Edge 中,项目按照添加的顺序进行记录,在 Chrome 和 Firefox 中它们得到按字母顺序记录,这意味着代码的注释部分无法按预期工作。

【问题讨论】:

  • sessionStorage 不是 一个数组......是什么让你认为任何东西都有任何特定的顺序?请发布一些 code 来展示您遇到的问题 - 即“破坏”的“脚本”(注意:firefox 没有这样的事情,只有 chrum
  • 完成,添加代码示例。帮助将不胜感激。
  • in Chrome and Firefox they get logged alphabetically no ... 不是 firefox ... chrome 是异常值,bad bad chrome :p 如果您看到 firefox 做任何不同的事情,也许您的 firefox ' - 实际上,Firefox 要复杂得多 - 它几乎是随机的
  • 从中学到一件事......对象键没有顺序 - 永远不要依赖它

标签: javascript html session-storage


【解决方案1】:

虽然存储有一个length 属性,并且您可以从0length - 1 获取索引的键,但它不是一个数组,它没有定义的顺序。来自the spec

key(n) 方法必须返回列表中第 n 个键的名称。 键的顺序是用户代理定义的,但在对象内必须保持一致,只要键的数量不变。 (因此,添加或删除键可能会改变键的顺序...

(我的重点)

如果您想要定义的顺序,请将数组存储在存储中,而不是通过 JSON 存储单个条目:

页面加载/从存储读取时,从存储中获取数组:

entries = JSON.parse(sessionStorage.getItem("entries") || "[]");

请注意,如果"entries" 不在sessionStorage 中,getItem 将返回null,因此我们为JSON.parse 提供默认的"[]" 来解析。 (有很多方法可以给猫剥皮,这只是其中之一。)

当你想保存到存储时:

sessionStorage.setItem("entries", JSON.stringify(entries));

这样,条目按照定义的顺序(数组的顺序)。


重新编辑:entries 将是您产品的对象数组。

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    相关资源
    最近更新 更多