2017-10-12 158 views
-1

我有一組下拉框,我將使用JSON填充。我想要做的是用每個對象的名稱填充第一個下拉列表。然後,當某人從第一個下拉列表中選擇一個選項時,第二個下拉列表將填入與其第一個選擇相關的其他數據。我現在所擁有的是用產品名稱填充第一個選擇框並將值分配給ID對於第二個下拉列表,我希望選項基於與在第一個下拉列表中選擇的產品相關聯的選項,基於ID。根據第一個選擇從特定JSON對象獲取值

這裏是我到目前爲止,我不知道如何根據產品ID從選定的產品只能獲得數據:

$(function() { 
 
    var products = [{ 
 
     "id": 0, 
 
     "name": "First Product", 
 
     "sizes": [{ 
 
      "size": "small" 
 
     },{ 
 
      "size": "medium" 
 
     }] 
 
     }, 
 
     { 
 
     "id": 1, 
 
     "name": "Second Product", 
 
     "sizes": [{ 
 
      "size": "small" 
 
     },{ 
 
      "size": "medium" 
 
     }] 
 
    } 
 
    ] 
 

 
    $.each(products, function(key, val) { 
 
     $('.first').append('<option value="' + val.id + '">' + val.name + '</option>'); 
 
    }); 
 
    
 
    $('.first').change(function() { 
 
     var selectedProduct = $(this).val(); 
 
     $.each(products['id'][selectedProduct], function(key, val) { 
 
     $('second').append('<option id="' + val.sizes.size + '">' + val.sizes.size + '</option>'); 
 
     }); 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<select class="first"> 
 

 
</select> 
 

 
<select class="second"> 
 

 
</select>

+0

你想在第二個下拉顯示什麼。所選產品的尺寸? –

+0

@SKJajoriya正確,我忘了改變這些值時,我從第一個複製功能 – user13286

+0

爲什麼downvote? – user13286

回答

1
$(function() { 
    var products = [{ 
     "id": 0, 
     "name": "First Product", 
     "sizes": [{ 
      "size": "small" 
     },{ 
      "size": "medium" 
     }] 
    }, { 
     "id": 1, 
     "name": "Second Product", 
     "sizes": [{ 
      "size": "small" 
     },{ 
      "size": "medium" 
     }] 
    }] 

    $.each(products, function(key, val) { 
     $('.first').append('<option value="' + val.id + '">' + val.name + '</option>'); 
    }); 

    $('.first').change(function() { 
     var selectedProduct = $(this).val(); 

     var getProduct = products.filter(function(obj) { 
      return obj.id == selectedProduct; 
     }); 
     $('.second').find('option').remove(); 
     $.each(getProduct[0].sizes, function(key, val) { 
       $('.second').append('<option id="' + val.size + '">' + val.size + '</option>'); 
      }); 
    }); 
}); 
+0

我喜歡使用'filter',這似乎是最乾淨的解決方案。謝謝! – user13286

1

你只需要遍歷產品再次找到具有當前選定ID的產品。然後,重複它的大小並填充第二個,就像第一個一樣。

每次清除選項。

然後,在開始時觸發'更改'以獲得第二個填充開始。

$(function() { 
    var products = [{ 
     "id": 0, 
     "name": "First Product", 
     "sizes": [{ 
      "size": "small" 
     },{ 
      "size": "medium" 
     }] 
     }, 
     { 
     "id": 1, 
     "name": "Second Product", 
     "sizes": [{ 
      "size": "med" 
     },{ 
      "size": "large" 
     }] 
    } 
    ] 

    $.each(products, function(key, val) { 
     $('.first').append('<option value="' + val.id + '">' + val.name + '</option>'); 
    }); 

    $('.first').change(function() { 
     var selectedProduct = $(this).val(); 
     $.each(products, function(key, val) { 
      if (val.id==selectedProduct) { 
       $('.second').find('option').remove(); 
       $.each(val.sizes, function(key2, val2) { 
        $('.second').append('<option value="' + val2.size + '">' + val2.size + '</option>'); 
       }); 
      } 
     }); 
    }); 

    $('.first').trigger('change'); 
}); 
1

您可以將選項上的對象作爲數據字段作爲參考。

$(function() { 
 
    var products = [{ 
 
     "id": 0, 
 
     "name": "First Product", 
 
     "sizes": [{ 
 
      "size": "small" 
 
     },{ 
 
      "size": "medium" 
 
     }] 
 
     }, 
 
     { 
 
     "id": 1, 
 
     "name": "Second Product", 
 
     "sizes": [{ 
 
      "size": "small" 
 
     },{ 
 
      "size": "medium" 
 
     }] 
 
    } 
 
    ] 
 

 
    $.each(products, function(key, val) { 
 
     var $option = $('<option>').val(val.id).text(val.name).data('object-reference', val); 
 
     $('.first').append($option); 
 
    }); 
 
    
 
    $('.first').change(function() { 
 
     var selectedProduct = $(this).find('option:selected'); 
 
     
 
     $.each(selectedProduct.data('object-reference').sizes, function(key, val) { 
 
     $('.second').append('<option id="' + val.size + '">' + val.size + '</option>'); 
 
     }); 
 
    }); 
 
    
 
    
 
    setTimeout(function(){ 
 
     products[1].sizes = [ { 'size': 'changed1' }, { 'size': 'changed2' } ]; 
 
    }, 2000); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<select class="first"> 
 

 
</select> 
 

 
<select class="second"> 
 

 
</select>

+0

儘管你已經不必要地複製了你的數據。 '產品'後面,DOM中的對象引用。如果產品數組因任何原因而發生更改,這些更改將不會反映在第二個下拉列表中。 – oflahero

+1

我不同意。兩者都指向指向相同子尺寸數組的相同外部對象。更改大小數組中的任何一個都會影響另一個,因爲它們與內存中的元素相同 – Taplar

+0

您是對的。 TIL。這很有用! – oflahero