【问题标题】:How to prevent storing duplicate values in local storage?如何防止在本地存储中存储重复值?
【发布时间】:2015-02-20 01:22:59
【问题描述】:

我不知道如何解释这一点,但基本上我希望用户在尝试保存已经在本地存储中的数据时收到警报,即用户单击保存按钮将数据保存到收藏夹(本地存储)。但是当他们第二次尝试时应该这样说“这已经被保存了,除非你从存储中删除数据,否则你不能再次保存”我可以让它在用户单击按钮保存后显示存储中的内容数据。我正在尝试在 html 中执行此操作,并使用具有存储数据的外部 json 文件,然后将其保存到浏览器的本地存储中。应该只允许用户保存属性 html 页面的数据,例如只保存一次。我尝试切换我的 if 和 else 条件,但我无法让它工作。

Javascript 代码

$(".save").on("click", function() {
console.log("Saving property id to local storage");
try {
    $(this).attr('disabled', true);

    var propIdToAdd = $(this).closest("p").attr("id");

    var myFavouriteProp = JSON.parse(localStorage.getItem("data"));

    if (data.Properties.id == myFavouriteProp) {
        alert("Same property is already favourited!");
    } else(myFavouriteProp == null)
    myFavouriteProp = [];
    myFavouriteProp.push(propIdToAdd);

    localStorage.setItem("data", JSON.stringify(myFavouriteProp));
} catch (e) {
    if (e == QUOTA_EXCEEDED_ERR) {
        console.log("Error: Local Storage limit Exceeded");
    } else {
        console.log("Error: Saving to Local Storage");
    }
}

});
$("#viewFavourites").on("click", function() {
console.log("Restoring array data from local storage");

myFavouriteProp = JSON.parse(localStorage.getItem('data'));
var output = "<ul>";
if (myFavouriteProp != null) {
    for (var i = 0; i < data.Properties.length; i++) {
        for (j = 0; j < myFavouriteProp.length; j++) {
            if (data.Properties[i].id == myFavouriteProp[j]) {
                output += "<li>" + data.Properties[i].id + "</li>";
            }
        }
    }
}
output += "</ul>";
document.getElementById("placeholder").innerHTML = output;
});
});

我没有指出这一点,但是,我如何让它查看我的所有 id?即prop1,prop2。我的保存功能当前会覆盖存储在本地存储中的旧值。但是我的旧保存功能允许我显示如下所示的所有 ID 代码:

    $(".save").on("click", function(){
  try{
      $(this).attr('disabled',true);

      var propIdToAdd = $(this).closest("p").attr("id");

      var myFavouriteProp = JSON.parse(localStorage.getItem('data'));
      if (myFavouriteProp == null) {
          myFavouriteProp = [];
      }
      myFavouriteProp.push(propIdToAdd);

      localStorage.setItem('data', JSON.stringify(myFavouriteProp));
  }
  catch(e) {
      if (e == QUOTA_EXCEEDED_ERR) {
          console.log("Error: Local Storage limit exceeds. ");
      }
      else {
          console.log("Error: Saving to local storage.");
      }
  }
  });

此外,当我尝试添加 if (data.Properties.id == myFavouriteProp[0]) 时,它会阻止我的按钮工作。单击保存按钮,然后单击查看按钮后,没有显示任何内容。如果没有 [0],它会显示警报框以及存储中包含的内容。但就像我说的,我当前的代码(不是旧的)覆盖旧数据并用新数据替换它。它不应该这样做。它应该允许我显示 prop1、prop2 等的 id 值。在覆盖值 id prop1 后,它本身不是 prop2。它们不应覆盖,因为它们是不同的 id。

【问题讨论】:

  • “这已经被保存了,你不能再次保存,除非你从存储中删除数据” - 什么?用户为什么要这样做?
  • 对不起,如果我不清楚,基本上用户应该只能保存一次唯一值(“id”=“prop1”)。我有一个删除本地存储的按钮。
  • 您的else 子句有点奇怪,因为您有else 后跟括号(,而不是预期的大括号{else 后面但不在括号中的代码始终运行,因为它不包含在括号内。

标签: javascript jquery html json


【解决方案1】:

在我看来,当您保存时,您的 myFavouriteProp 变量是一个包含一个元素 propId 的数组。基本上在 JSON 中,它看起来像这样[2]

if (data.Properties.id == myFavouriteProp) 中,您将data.Properties.id(我假设它是一个整数)与myFavouriteProp(我认为它是一个数组)进行比较(您正在比较2 == [2])。这永远不会是真的。

我会将比较更改为 if (data.Properties.id == myFavouriteProp[0]),看看这是否更适合您。这会将整数值与整数值进行比较,并且应该按照您期望的方式工作。

【讨论】:

  • 尝试添加这个。但我不确定我做错了什么。第一次单击按钮后,我的“保存到收藏夹”按钮永久变灰。只有在清除本地存储后才会停止变灰。
  • 在保存功能的顶部有$(this).attr('disabled', true); 第一次单击保存按钮时,这将始终禁用保存按钮。我看不到它在代码中的哪个位置重新启用。要重新启用它,请使用函数$(this).removeAttr('disabled')
  • 糟糕,我忘了删除它。抱歉,如果我不清楚,如果用户事先单击按钮将数据存储到本地存储,他们应该会收到警报,说他们已经保存了它。我该怎么做呢?当我尝试再次单击时,不会出现任何警报。抱歉,我是初学者。
  • 按照我的回答中所述将比较 if (data.Properties.id == myFavouriteProp) 更改为 if (data.Properties.id == myFavouriteProp[0]) 应该可以。如果不是,在上述 if 语句之上,我会尝试使用 console.log(data.Properties.id)console.log(myFavouriteProp) 将变量打印到您的控制台,以查看它们的值是什么以及它们是否实际匹配。
  • 我没有指出这一点,但是,我如何让它查看我所有的身份证?即prop1,prop2。我的保存功能当前会覆盖存储在存储中的旧值。但是我的旧保存功能允许我显示所有 ID。编辑主帖以显示旧的保存代码。
猜你喜欢
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2013-07-03
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多