我有一个包含一些json数据的变量json。我正在尝试检索该数据的特定部分。我可以使用如下所示的索引来完成它:
var newdata = json[listid].Taxonomies[0];
但是我希望能够使用名称检索数据... 例如,我想获取数据
json[listid].Taxonomies[?].InternalName = 'ABC'
我不知道'?'的价值
有没有办法可以在不对分类法进行每个循环的情况下做到这一点?
答案 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]);
请注意,如果您担心性能,则应使用对象而不是数组来表示数据,并且可以通过要搜索的属性对其进行键入。
如果我需要在阵列上多次搜索,我使用的有用功能如下。这会将数组转换为可以在没有循环的情况下访问的映射。如果您担心性能问题,只需要以该格式生成数据即可。
/**
* 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);
答案 4 :(得分:0)
您可以使用JQuery Javascript库将JSON解析为对象。从那里,您可以使用点语法访问属性。
http://api.jquery.com/jQuery.parseJSON/
var obj = jQuery.parseJSON('{"name":"Bob"}');
alert(obj.name === "Bob");