2017-08-17 9 views
3

ドロップダウンメニュー のすべてのブランドと値にアクセスしようとしていますが、この方法ではできませんでした。jqueryでJSON入れ子配列にアクセスする方法

<select id="secim"> 
</select> 

var data = [ 
     { 
      "products": "Cars", 
      "brands_values" : [ 
      {"brand":"fiat","value":1}, 
      {"brand":"bmw","value":2} 
      ] 
     } 
     ]; 

$.each(data, function(i, item) { 
     $('#secim').append($('<option>', { 
      value: item.brands_values.value, 
      text: item.brands_values.brand 
     })); 
     }); 

どうすればいいですか?ありがとうございます

+2

この問題は、ここでは 'brands_values'が複数の値を持つ配列であるということです。 'brands_values'内の要素を反復処理するには、' $ .each'を使ってループを追加する必要があります。 – Lix

答えて

2

だけのブランドのために別のループを追加します。

var data = [ 
 
    { 
 
    "products": "Cars", 
 
    "brands_values" : [ 
 
     {"brand":"fiat","value":1}, 
 
     {"brand":"bmw","value":2} 
 
    ] 
 
}]; 
 

 
$.each(data, function(i, item) { 
 
    if (item.brands_values) { 
 
     item.brands_values.forEach(brands => { 
 
     $('#secim').append($('<option>', { 
 
      value: brands.value, 
 
      text: brands.brand 
 
     })); 
 
     }); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<select id="secim"> 
 
</select>

注:あなたが、その場合にはネイティブ.forEachを使用したい場合があり、それがあるので、十分な。私はいつでも私ができる(check this)それを避けるように、私は過去にjQuery.each()とパフォーマンスの問題を持っていた:

data.forEach(item => { 
    if (item.brands_values) { 
     item.brands_values.forEach(brands => { 
      $('#secim').append($('<option>', { 
       value: brands.value, 
       text: brands.brand 
      })); 
     }); 
    } 
}); 
+0

動作しますが、なぜ2つのループ?? –

+0

あまりにも多くの人が働いてくれてありがとう – ucnumara

+0

@ucnumara助けてうれしい!! – DontVoteMeDown

0

データだけでなくブランド価値を反復します。あなたはそれぞれのブランドと価値にアクセスすることができます。

var data = [ 
 
     { 
 
      "products": "Cars", 
 
      "brands_values" : [ 
 
      {"brand":"fiat","value":1}, 
 
      {"brand":"bmw","value":2} 
 
      ] 
 
     } 
 
     ]; 
 

 
    
 
    $.each(data[0].brands_values, function(i, item) { 
 
     $('#secim').append($('<option>', { 
 
       value: item.value, 
 
       text: item.brand 
 
      })); 
 
      });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<select id="secim"> 
 
</select>

+0

ありがとうございますが動作していません – ucnumara

+0

@ucnumara今すぐチェックしてください –

+0

IMOブランドの価値をチェックするのは良い方法ですが、nullにすることもできます。また、 'data.length> 0'をハードコーディングしている場合はインデックスです。 – DontVoteMeDown

1
$.each(data, function(i, item) { 
    $.each(item.brands_values, function(j, brand){ 
    $('#secim').append($('<option>', { 
     value: brand.value, 
     text: brand.brand 
    })); 
    }); 
}); 

あなたが別の反復を必要とする - もちろん、最初の「ループ」は非常にエレガントではありませんが、これは、指定されたデータ形式のためです。

ワーキングフィドル:https://jsfiddle.net/3pL6n6pj/

+0

あなたにもありがとう、それは働いています – ucnumara

0

はまず#reduce()機能を使用することによりdataからbrand_valuesのリストを作成します。次に、itemsとして$.eachに渡します。以下

参照のデモ:

var data = [{ 
 
    "products": "Cars", 
 
    "brands_values": [{ 
 
     "brand": "fiat", 
 
     "value": 1 
 
    }, 
 
    { 
 
     "brand": "bmw", 
 
     "value": 2 
 
    } 
 
    ] 
 
}]; 
 

 
var items = data.reduce(function(p,c){ 
 
    c.brands_values.forEach(function(e){ 
 
    p.push(e); 
 
    }); 
 
    return p; 
 
},[]); 
 

 
$.each(items, function(i,item) { 
 
    $('#secim').append($('<option>', { 
 
    value: item.value, 
 
    text: item.brand 
 
    })); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<select id="secim"></select>

+0

@ucnumaraこれについてあなたの考えは?ありがとう! – kukkuz

関連する問題