将更多的对象数组添加到本地存储键中

3

我有一个本地存储键 'st',其值为:

[{"id":"es","state":"5hwrte5"},{"id":"bs","state":"dakiei3"}]

如果最后一个keyvalue不存在,我想在结尾添加一个更多的keyvalue,以此来达到以下结果:
[{"id":"es","state":"5hwrte5"},{"id":"xs","state":"dakiei3"},{"id":"NEWKEY","state":"off"}]

所以我尝试的方法是:

if (typeof getstate(json, 'NEWKEY') == "undefined"){
  localStorage["st"] = JSON.stringify([{
     "id": "es",
     "state": getstate(json, "es")
  }, {
     "id": "xs",
     "state": getstate(json, "bs")
  }, {
     "id": "NEWKEY",
     "state": "off"
  }])
}

getstate可以为我提供特定ID的状态。

现在主要问题是,我希望保持值不变(因此需要在获取时检索它们),并使用最简单的方法,这样如果我的密钥有30个不同的ID,并且我想添加1个ID,我就不必检索所有30个ID的值。


1
你可以直接测试 === undefined,无需使用 typeof,除非你正在处理可能未定义的变量(例如 typeof foo == 'undefined',因为在这种情况下 foo === undefined 会出错)。 - ThiefMaster
1
只是让你明白,JSON是一种用于交换JavaScript数据的字符串格式。你是在谈论实际的JSON字符串吗?还是关于JavaScript对象数组? - jfriend00
@jfriend00 更改了标题。我在谈论一个JavaScript对象数组。 - jQuerybeast
1个回答

2

看起来您最好使用将每个ID用作键的对象,而不是对象数组

var st={
  "es":{"state":"5hwrte5"},
  "xs":{"state":"dakiei3"}
}

然后要访问特定ID的数据:
alert( st.es.state);

添加新属性:

st['newKey']={state:"off"}/* same as writing st.newKey={state:"off"}
     /* OR*/
st.newKey={state:"off"}

对象将如下所示:

var st={
  "es":{"state":"5hwrte5"},
  "xs":{"state":"dakiei3"},
  newKey :{state:"off"}/* quotes on object keys are optional unless they contain special characters or spaces*/
}

您可以使用JSON.stringify(st)JSON.parse(localStorage['st'])将整个对象转换为JSON格式。

编辑:如果您喜欢保留数组格式,可以按以下方式添加新元素:

var st = [{"id":"es","state":"5hwrte5"},{"id":"bs","state":"dakiei3"}];

st.push( {"id":"NEWKEY","state":"off"})

/* results in */
[{"id":"es","state":"5hwrte5"},{"id":"xs","state":"dakiei3"},{"id":"NEWKEY","state":"off"}]

使用数组,您需要循环遍历数组中的每个元素来搜索特定的ID。

for(i=0 ; i< st.length; i++){
     var object= st[i];
    if ( object.id=="NEWKEY"){
           alert(object.state)
    }
}

我并没有看到你的回答和我目前使用的解决方案有什么区别。我试图避免最后一段代码,因为如果例如在一行中有30个不同的ID,我将不得不为它们全部赋值。我正在尝试做类似这样的事情:获取当前整个键及其ID和值,并添加1个额外的值。 - jQuerybeast
好的,使用push()方法向数组中添加一个元素非常容易,这是JavaScript数组的一种方法。但是当您需要通过ID访问特定信息时,我的想法是,在数组中,您必须循环整个数组以查找所需ID的对象...或者知道其索引位置。 - charlietfl
我有点意识到关于数组方法的推动,但我不确定如何将其传递到本地存储键st中。给我一秒钟。 - jQuerybeast
因为如果我将键作为 var st = localStorage.getItem("st"); 检索,那么我就无法将其推入。 - jQuerybeast
1
使用 var st=JSON.parse(localStorage.getItem("st")) 从存储中创建 JavaScript 对象/数组,然后使用 JSON.stringify 将其放回。 - charlietfl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接