首页 > 解决方案 > 用JS查找localStorage的命名对象数组中是否存在特定的一对值

问题描述

在 localStorage 我之前设置了以这种格式存储的各种对象

console.log(localStorage) 
// Outputs the storage this way, it may contain different objects (randid for example)

Storage {
    876346545: "{"ABA":"876346545","ABB":"37578533567","ABC":"AE123456","ABD":"1234567890123456"}", 
    randid: "fhjidc06om230j2r367gh1i5iec", 
    353446545: "{"ABA":"353446545","ΑBB":"12343212341","ΑBC":"CC949590","ABD":"5943949562340543"}", 
    length: 3
}

例如,我尝试查找此对象数组中是否存在特定对

 //Pseudo-code
 if anyofObject in localStorage contains pair ("ABA":"876346545") return true or false

我的代码没有达到我的预期

var data = JSON.parse(localStorage) // I tried and without Parsing it as JSON

for (var key in data) {
    if (data[key].ABA = "876346545") {
        var m = data[key];
        console.log("Found: ", m)
        break;
    }
}

标签: javascriptarraysjsonlocal-storage

解决方案


如果您想浏览本地存储中的所有值存储。您必须执行以下操作:

  1. 使用 获取所有值Object.values,并开始一一过滤
  2. 尝试将它们解析为 JSON 对象,有些会失败,因为它们不是 JSON 对象,那些不是我们感兴趣的
  3. 那些成功解析的,您需要检查键并查看该键的值是否与类型和值匹配正确匹配。返回 true 以便我们可以完成搜索并将值存储在变量中。

另外,请注意,当您比较值时使用===而不是=在您的 if 语句中,如您在问题中所示。另外,比较时要注意类型。您将 ABA 设置为数字,但您尝试与字符串进行比较。

userData = {
  "ABA": 876346545, 
  "ABB": 37578533567, 
  "ABC": "AE123456", 
  "ABD": 1234567890123456
};

localStorage.setItem("Some Random Key", JSON.stringify(userData));

// This will find the object and store it in foundObject variable
const foundObject = Object.values(localStorage).find(v => { 
  try { 
    return JSON.parse(v).ABA === 876346545; 
  } catch(e) {
    return false;
  };
});

console.log(JSON.stringify(foundObject));

// This will find the object and store true if found, false if not found in hasObject variable
const hasObject = Object.values(localStorage).some(v => { 
  try { 
    return JSON.parse(v).ABA === 876346545; 
  } catch(e) {
    return false;
  };
});

console.log(JSON.stringify(hasObject));

推荐阅读