1

如果之前有人问过这个问题,我深表歉意,但我似乎无法从这里的其他帖子中找到解决方案。

我正在尝试在本地存储中构建一个 json 数组(这很好),但想在添加新值之前检查一个条目是否已经存在。

Json 本身

[{"title":"title1","url":"somefile1.pdf","background":"bg1.png"},
{"title":"title2","url":"somefile2.pdf","background":"bg2.png"},
{"title":"title3","url":"somefile3.pdf","background":"bg3.png"}]

现在我将如何查询数组以确保只添加唯一条目?

这是要添加到数组的代码

var oldItems = JSON.parse(localStorage.getItem('itemsArray')) || [];

        var newItem = {
            'title': title,
            'url': url,
            'background': background
        };

        // Need to check the newItem is unique here //

        oldItems.push(newItem);
        localStorage.setItem('itemsArray', JSON.stringify(oldItems));

我想我可以在设置 localstorage 对象之前使用 jquery unique 函数

var cleanedItems = $.unique(oldItems);
localStorage.setItem('itemsArray', JSON.stringify(cleanedItems));

但这没有用...

4

1 回答 1

1

您必须遍历从本地存储解析的数组中的每个项目,并使用新项目执行对象相等性测试。

对象相等性测试并不像obj1 == obj2.

以下是一些帮助您入门的参考资料

JSON.stringify通过将新对象作为 JSON 字符串与旧数组中的对象作为 JSON 字符串进行比较,以下可能最终对您有用。

function objInArr(newObj, oldItems) {
    var newObjJSON = JSON.stringify(newObj);
    for (var i = 0, l = oldItems.length; i < l; i++) {
        if (JSON.stringify(oldItems[i]) === newObjJSON) {
            return true;
        }
    }
    return false;
}

var oldItems = JSON.parse(localStorage.getItem('itemsArray')) || [];

var newItem = {
    'title': title,
    'url': url,
    'background': background
};

// Need to check the newItem is unique here
if (!objInArr(newItem, oldItems)) {
    oldItems.push(newItem);
}
localStorage.setItem('itemsArray', JSON.stringify(oldItems));
于 2013-11-09T00:46:02.803 回答