首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询嵌套的JSON

查询嵌套的JSON
EN

Stack Overflow用户
提问于 2013-03-08 06:54:46
回答 5查看 3.1K关注 0票数 3

我有一些JSON数据,格式如下:

代码语言:javascript
复制
{
    "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"
    }]
}

我需要做的是查询“variations”数组中的值,如果找到匹配的值,则返回对象。

我可以很好地查询“第一级”的值:

代码语言:javascript
复制
var results = jQuery.grep(obj, function (element, index) {
    return element.offerPrice == "42.00";
});

如果我指定了一个索引值(显然我不想这样做),我可以查询变量:

代码语言:javascript
复制
var results = jQuery.grep(obj, function (element, index) {
    return element.variations[1].key == "Personalization" && element.variations[1].value == "2 Lines of Personalization";
});

理想情况下,这是我想要做的,但它不起作用:

代码语言:javascript
复制
var results = jQuery.grep(obj.variations, function (element, index) {
    return element.key == "Personalization" && element.value == "2 Lines of Personalization";
});

我一直在想:

代码语言:javascript
复制
Uncaught TypeError: Cannot read property 'length' of undefined

这是一个jsFiddle:http://jsfiddle.net/VzqWW/3/

有什么想法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-03-08 07:11:47

没有像obj.variations这样的对象,因为obj是一个数组。像这样的东西应该是有效的:

代码语言:javascript
复制
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);
});
票数 3
EN

Stack Overflow用户

发布于 2013-03-08 07:12:06

您可以使用标准的数组过滤来实现这一点,其中的map (link)、reduce (link)和filter(link)方法是作为ES5的一部分提供的,我已经更新了jsfiddle以使用它们,但代码是内联的:

代码语言:javascript
复制
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这样的东西来添加这些方法。

票数 1
EN

Stack Overflow用户

发布于 2013-03-08 07:39:24

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

代码语言:javascript
复制
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";
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15283418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档