从json获取特定数据

时间:2013-04-16 19:28:22

标签: javascript jquery json

我有一个包含一些json数据的变量json。我正在尝试检索该数据的特定部分。我可以使用如下所示的索引来完成它:

var newdata = json[listid].Taxonomies[0];

但是我希望能够使用名称检索数据... 例如,我想获取数据

json[listid].Taxonomies[?].InternalName = 'ABC'

我不知道'?'的价值

有没有办法可以在不对分类法进行每个循环的情况下做到这一点?

5 个答案:

答案 0 :(得分:1)

没有循环就无法做到这一点,但存在隐藏循环的库。

例如,使用JSPath,您可以找到InternalName属性的每个实例,无论它的嵌套程度如何:

> var json = { 1: { Taxonomies: [ { InternalName: 'ABC' } ] }}
> JSPath.apply('..InternalName', json);
["ABC"]

答案 1 :(得分:1)

有些人建议使用linqjs,如果你需要大量的JSON查询,这可能没问题。但是,对于此问题,您可以使用Array.filter指定要查找的项目。显然,幕后还有一个循环。

var matches  = json[listid].Taxonomies.filter(function(obj) {
    return obj.InternalName === "ABC";
})

console.log(matches[0]);

http://jsfiddle.net/MC94q/

请注意,如果您担心性能,则应使用对象而不是数组来表示数据,并且可以通过要搜索的属性对其进行键入。

如果我需要在阵列上多次搜索,我使用的有用功能如下。这会将数组转换为可以在没有循环的情况下访问的映射。如果您担心性能问题,只需要以该格式生成数据即可。

/**
 * Creates a map by the given property to allow fast searches
 * @param {object[]} arr Array that we want to create a map from
 * @param {string} keyProp The property to key by
 * @param {boolean} [allowDuplicates] If this is true, the value
 *        of each key in the returned object will be an array with 
 *        all matches
 * @return A map keyed by the requested property. If the parameter 
 *         allowDuplicates is falsy, key property collisions will 
 *         overwrite the previous value. If the allowDuplicates is true,
 *         the map will have as its value an array of objects for the given key
 *
 * Example: Given the following array: arr=[{a:1, b:2}, {a:1, b:3}, {a:3, b:4)]
 *   The call to mapFromArray(arr, 'a') returns the following
 *          { 1: {a:1, b:3}, 3: {a:3, b:4} }
 *   Notice that {a:1,b:2} is not in the returned map because it has the 
 *   same value in the key property 'a' as {a:1, b:3}, which wins out 
 *   since it's later.
 *
 *   Calling  mapFromArray(arr, 'a', true) returns the following
  *         { 1: [{a:1, b:2}, {a:1, b:3}], 3: [{a:3, b:4}] }
 */
function mapFromArray(arr, keyProp, allowDuplicates) {
    var map = {};
    for (var i = 0, ln = arr.length; i < ln; i++) {
        if (!allowDuplicates) {
            // No duplicates allowed, may be overwriting an existing value
            map[arr[i][keyProp]] = arr[i];
        } else {
            // Duplicates are allowed, create array of matching objects
            // Ext.Array.push creates a one item array if its argument is
            // not already an array, otherwise, it pushes and returns the array
            map[arr[i][keyProp]] = Ext.Array.push(map[arr[i][keyProp]], arr[i]);
        }
    }
    return map;
}

所以说你想搜索“ABC”'DEF''GHI'之一InternalName的分类法,你会做以下事情:

var map = mapFromArray(json[listid].Taxonomies, "InternalName");
var ABC = map['ABC'], DEF = map['DEF'], GHI = map['GHI'];

答案 2 :(得分:0)

var newdata = json[listid].Taxonomies.filter(function(el){
  return el.InternalName === "ABC";
})[0];

应该涵盖像这样的物体的第一次出现。如果您想要所有出现的数组,可以在最后删除[0]

请注意,我假设一个嵌套级别,因为这就是问题的措辞。如果你需要在任意深度数据结构中找到属性,那么这里的一些其他库可能更有意义。

答案 3 :(得分:0)

首先想到的是linqjs(http://linqjs.codeplex.com/)。以下是您输入的示例。

var jsonArray = [
    { "listid": 1, 
     Taxaonomies:
        [ 
            { "id": 100, "InternalName": "d_linq" },
            { "id": 200, "InternalName": "fred" }
        ]
    },
    { "listid": 2, 
        Taxaonomies:
        [ 
            { "id": 100, "InternalName": "asdf" },
            { "id": 200, "InternalName": "qwer" }
        ]
    }
];

var queryResult = Enumerable.From(jsonArray)
    .Where(function (x) { 
        return Enumerable.From(x.Taxaonomies).Any(function (y) { return y.InternalName == "fred" }) 
    })
    .ToArray();

console.log(queryResult);

看到这个小提琴:http://jsfiddle.net/alexdresko/3zsy9/

答案 4 :(得分:0)

您可以使用JQuery Javascript库将JSON解析为对象。从那里,您可以使用点语法访问属性。

http://api.jquery.com/jQuery.parseJSON/

var obj = jQuery.parseJSON('{"name":"Bob"}');
alert(obj.name === "Bob");