Как остановить Chrome и Firefox от сортировки sessionStorage по ключам по алфавиту? - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть 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.

После добавления элемента циклически перемещается по хранилищу сессии и консоли.log () - каждый элемент работает по-разному в разных браузерах: в Edge элементы регистрируются в том порядке, в котором они были добавлены, в Chrome и Firefox они регистрируются в алфавитном порядке, что означает, что закомментированный раздел кода не может работать какпредназначенный.

1 Ответ

0 голосов
/ 29 сентября 2018

Хотя хранилище имеет свойство length, и вы можете получить ключ для индексов от 0 до length - 1, это , а не массив, и у него нет определенного порядка.Начиная с спецификации :

Метод key(n) должен возвращать имя n -го ключа в списке. Порядок ключей определяется пользовательским агентом , но он должен быть согласованным внутри объекта, пока количество ключей не меняется.(Таким образом, добавление или удаление ключа может изменить порядок ключей ...

(мой акцент)

ЕслиВы хотите определенный порядок, сохраняйте массив в хранилище, а не храните отдельные записи через JSON:

При загрузке страницы / при чтении из хранилища получите массив из хранилища:

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

Обратите внимание, что если "entries" отсутствует в sessionStorage, getItem вернет null, поэтому мы предоставляем значение по умолчанию "[]" для JSON.parse для анализа (есть много способов скинуть эту кошку,это только один из них.)

Когда вы хотите сохранить в хранилище:

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

Таким образом, записи находятся в порядке , который вы определяете (порядок массива).


Повторное редактирование: entries будет массивом объектов для ваших продуктов.

...