3

次のようにフォーマットされた 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/

何か案は?

4

5 に答える 5

1

grep と一緒にjQuery.mapを使用してこれはどうですか。

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";
});
于 2013-03-07T23:39:24.193 に答える
0

これは私のために働きます。

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";
});
于 2013-03-07T23:19:27.627 に答える
0

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のいくつかを見つけることができます。

一般に、古いブラウザをサポートしたい場合は、ES5 機能用の shim を用意することをお勧めします。

于 2013-03-07T23:29:21.953 に答える