慕桂英4014372
(您不是在搜索“JSON”,而是在搜索数组 - JSON字符串已经被反序列化为对象图,在本例中是一个数组。)一些选择:使用对象而不是数组如果你控制了这个东西的产生,它必须是一个数组吗?因为如果没有,那就有一个更简单的方法。说这是你的原始数据:[
{"id": "one", "pId": "foo1", "cId": "bar1"},
{"id": "two", "pId": "foo2", "cId": "bar2"},
{"id": "three", "pId": "foo3", "cId": "bar3"}]你可以做以下事吗?{
"one": {"pId": "foo1", "cId": "bar1"},
"two": {"pId": "foo2", "cId": "bar2"},
"three": {"pId": "foo3", "cId": "bar3"}}然后通过ID查找相关条目是微不足道的:id = "one"; // Or whatevervar entry = objJsonResp[id];......正如更新它:objJsonResp[id] = /* New value */;...并删除它:delete objJsonResp[id];这利用了以下事实:在JavaScript中,您可以使用属性名称作为字符串索引到对象 - 并且该字符串可以是文字,或者它可以来自变量,id如上所述。放入ID到索引图(愚蠢的想法,早于上述。保留历史原因。)看起来你需要将它作为一个数组,在这种情况下除了你想在它上面放置一个地图之外没有比搜索数组更好的方法,如果你能控制它的生成就可以做到这一点。宾语。比如说,你最初有这个:[
{"id": "one", "pId": "foo1", "cId": "bar1"},
{"id": "two", "pId": "foo2", "cId": "bar2"},
{"id": "three", "pId": "foo3", "cId": "bar3"}]生成代码可以提供id-to-index映射:{
"index": {
"one": 0, "two": 1, "three": 2
},
"data": [
{"id": "one", "pId": "foo1", "cId": "bar1"},
{"id": "two", "pId": "foo2", "cId": "bar2"},
{"id": "three", "pId": "foo3", "cId": "bar3"}
]}然后在变量中获取id的条目id是微不足道的:var index = objJsonResp.index[id];var obj = objJsonResp.data[index];这利用了您可以使用属性名称索引到对象的事实。当然,如果这样做,则必须在修改阵列时更新映射,这可能会成为维护问题。但是,如果您无法控制对象的生成,或者更新ids-to-index的映射是太多的代码和/或维护问题,那么您将不得不进行暴力搜索。蛮力搜索(更正)有点OT(虽然你确实问过是否有更好的方法:-)),但循环数组的代码是不正确的。这里有详细介绍,但你不能for..in用来遍历数组索引(或者更确切地说,如果你这样做,你必须特别努力); for..in循环遍历对象的属性,而不是数组的索引。使用非稀疏数组(和你的非稀疏数组)最好的选择是标准的老式循环:var k;for (k = 0; k < someArray.length; ++k) { /* ... */ }要么var k;for (k = someArray.length - 1; k >= 0; --k) { /* ... */ }无论你喜欢什么(后者在所有实现中并不总是更快,这对我来说是违反直觉的,但我们确实如此)。(使用稀疏数组,您可以使用for..in但是再次采取特殊的措施来避免陷阱;在上面链接的文章中更多。)使用for..in阵列上似乎在简单的情况下工作,因为数组为每个它们的索引,而他们唯一的默认属性(属性length和它们的方法)被标记为不可枚举。但是一旦你设置(或框架设置)数组对象上的任何其他属性(它完全有效;数组只是在length属性周围进行一些特殊处理的对象),它就会中断。