查询嵌套JSON

问题描述:

我的影片格式一些像这样的JSON数据:查询嵌套JSON

{ 
    "id": "ABC123", 
    "offerPrice": 42.00, 
    "regularPrice": 42.00, 
    "variations": [{ 
     "key": "Style", 
     "value": "Black" 
    }, { 
     "key": "Personalization", 
     "value": "2 Lines of Personalization" 
    }] 
}, { 
    "id": "987ZYX", 
    "offerPrice": 52.00, 
    "regularPrice": 52.00, 
    "variations": [{ 
     "key": "Style", 
     "value": "Black" 
    }, { 
     "key": "Personalization", 
     "value": "3 Lines of Personalization" 
    }] 
} 

我需要做的就是查询的“变化”阵列的内部值,如果发现匹配返回的对象。

我能够查询值的“第一级”就好:

var results = jQuery.grep(obj, function (element, index) { 
    return element.offerPrice == "42.00"; 
}); 

,我可以查询变化如果我指定的索引值(我显然不希望这样做) :

var results = jQuery.grep(obj, function (element, index) { 
    return element.variations[1].key == "Personalization" && element.variations[1].value == "2 Lines of Personalization"; 
}); 

这是理想我想这样做,但它不工作:

var results = jQuery.grep(obj.variations, function (element, index) { 
    return element.key == "Personalization" && element.value == "2 Lines of Personalization"; 
}); 

我不断收到:

Uncaught TypeError: Cannot read property 'length' of undefined 

这里有一个的jsfiddle:http://jsfiddle.net/VzqWW/3/

任何想法?

+0

您将需要使用.grep两次。 – 2013-03-07 23:06:49

+1

您期望输出的结构是什么? – MattDiamant 2013-03-07 23:09:59

+0

我以为我得到了嵌套greps的地方,但这会返回所有的对象http://jsfiddle.net/59RGE/(对不起,这是无益的 - 已被称为离开,但认为我的火腿尝试可能会给你一个线索) – Jon 2013-03-07 23:12:59

因为obj是一个数组,所以不存在obj.variations这样的对象。 类似的东西应该工作:

var results = jQuery.grep(obj, function (element, index) { 
    res = jQuery.grep(element.variations, function (element2, index2) { 
     return element2.key== "Personalization" && element2.value == "2 Lines of Personalization"; 
    }); 
    return (res.length != 0); 
}); 
+0

谢谢Tomer!我最终使用这种解决方案,因为它运行良好,不需要任何ES5垫片。我们绝对支持浏览器 2013-03-07 23:42:25

+0

不客气:) – 2013-03-07 23:50:14

您可以用标准的阵列与maplink)过滤,reducelink)和filterlink),其之际,ES5的一部分方法做到这一点,我已经更新在jsfiddle使用它们,但代码是内嵌在下面:

var variations = obj.map(function (x) { 
    return x.variations; 
}).reduce(function (x, y) { 
    return x.concat(y); 
}); 

var personalizationVariations = variations.filter(function (v) { 
    return v.key== "Personalization" && v.value == "2 Lines of Personalization" 
}); 
console.log('Personalization Variations', personalizationVariations); 

如果你支持ES3的浏览器(< IE9),你需要像es5shim它增加了这些方法。

这适用于我。

var obj=[{ 
    "id": "ABC123", 
    "offerPrice": 42.00, 
    "regularPrice": 42.00, 
    "variations": [{ 
     "key": "Style", 
     "value": "Black" 
    }, { 
     "key": "Personalization", 
     "value": "2 Lines of Personalization" 
    }] 
}, { 
    "id": "987ZYX", 
    "offerPrice": 52.00, 
    "regularPrice": 52.00, 
    "variations": [{ 
     "key": "Style", 
     "value": "Black" 
    }, { 
     "key": "Personalization", 
     "value": "3 Lines of Personalization" 
    }] 
}]; 
var result=$.grep(obj,function(element,index){ 
    return element.offerPrice=="42.00"; 
}); 
var variations=$.grep(result[0].variations, function(element, index){ 
    return element.key == "Personalization" && element.value == "2 Lines of Personalization"; 
}); 

在ES5你可以写这样的事情:

var filtered = obj.filter(function(el){ 
    return el.variations.some(function(el) { 
    return el.key === "Personalization" && el.value === "2 Lines of Personalization"; 
    }) 
}); 

console.log(filtered); 

您可以使用grep在jQuery来模拟filter,但据我所知,它没有像some什么。当然你可以效仿它。您还可以在MDN中找到垫片filtersome

一般来说,如果我们想要支持旧版本的浏览器,总是会有一个ES5功能的垫片。

如何使用jQuery.map与grep一起使用。

var allVariations = $.map(obj, function(element, i) { 
    return element.variations; 
}); 

var variations = $.grep(allVariations, function(variation, index) { 
    return variation.key == "Personalization" && variation.value == "2 Lines of Personalization"; 
});