json数组 根据动态key获得value 有什么好的方法?


json数组如下:


 javascript


 var jsonArr = [
        {"id": "1", "name": "A1"},
        {"id": "2", "name": "A2"},
        {"id": "3", "name": "A3"},
        {"id": "4", "name": "A4"},
        {"id": "5", "name": "A5"}
    ]


 现在有个动态key 1或者2 如何根据我的key获得对应的value值  除了简单的循环for in外 有没有更好的方法? 因为我个人认为如果json数组数据量庞大的情况下很耗性能。希望有大牛来指点指点。

jquery JavaScript

阿尔翰娜星光 9 years, 8 months ago

直接用查找表吧


 var jsonDic = [ 
    "1" : "A1",
    "key" : value
]

jsonDic[key] 这样获取

wufei33 answered 9 years, 8 months ago

如果真的量很大,并且反复用的话,你可以把数据结构改成:


 var jsonDic = [ 
"1" : {"id": "1", "name": "A1"},
"2" : {"id": "2", "name": "A2"},
"3" : {"id": "3", "name": "A3"},
"4" : {"id": "4", "name": "A4"},
"5" : {"id": "5", "name": "A5"}
]

店长SAMA answered 9 years, 8 months ago

如果你只是偶尔查一次,那就遍历吧,用 [].every 还是很容易写的,或者用 for ... in 也不难。

但是如果需要经常查找,那最好建立一个查找表,比如


 javascript


 function createLookMap(field) {
    var map = {}
    for (var i = 0; i < jsonArr.length; i++) {
        var item = jsonArr[i]
        var key = item[field]
        map[field] = item
    }
    return map
}

var idMap = createLookMap("id")

在查找的时候只需要直接从 idMap 中取就行了


 javascript


 var id = needId()
var obj = idMap[id]    // the found object or undefined

如果还需要按 name 来查找,可以再建一个查找表


 javascript


 var nameMap = creaetLookMap("name")

如果 name 不是唯一的,那创建查找表的时候就要耍点手段,保存一个数组而不是一个对象


 javascript


 function createLookMap(field) {
    var map = {}
    for (var i = 0; i < jsonArr.length; i++) {
        var item = jsonArr[i]
        var key = item[field]
        var list = map[key]
        fi (!list) {
            map[key] = list = []
        }
        list.push(item)
    }
    return map
}

注:程序未实际运行验证,可能会有一些小问题

千坂绫灰音 answered 9 years, 8 months ago

Your Answer