jqueryselectlist

JQuery - Hide/show option from previous selected dropdown


I want to hide option from previous selected dropdown but my solution only works for two dropdown list.

This means that when I come to third dropdown list it will not display selected option from second dropdown list which is ok but it will display selected option from first one.

So, as I understand, methods I'm using overrides the last one that's why it not works.

Here is my select lists:

<select id="select1" 
        onchange="getSelectValue(this.value)" 
        asp-for="AssignedGroups.GroupMemberId1" 
        asp-items="@(new SelectList(Model.Agents,"Agent_Id","Agent_Id"))" 
        class="form-control">
    <option hidden selected></option>
</select>

<select id="select2" 
        onchange="getSelectValue2(this.value)" asp-
        for="AssignedGroups.GroupMemberId2"  
        asp-items="@(new SelectList(Model.Agents,"Agent_Id","Agent_Id"))"  
        class="form-control" >
    <option hidden selected></option>
</select>

<select id="select3" 
        onchange="getSelectValue3(this.value)" asp-
        for="AssignedGroups.GroupMemberId3" 
        asp-items="@(new SelectList(Model.Agents, "Agent_Id", "Agent_Id"))" 
        class="form-control">
    <option hidden selected></option>
</select>

And my script: strong text

function getSelectValue(select1) {
            $("#select2 option[value='" + select1 + "']").hide();
            $("#select2 option[value!='" + select1 + "']").show();
            $("#select3 option[value='" + select1 + "']").hide();
            $("#select3 option[value!='" + select1 + "']").show();

    }

    function getSelectValue2(select2) {
        
            $("#select1 option[value='" + select2 + "']").hide();
            $("#select1 option[value!='" + select2 + "']").show();
            $("#select3 option[value='" + select2 + "']").hide();
            $("#select3 option[value!='" + select2 + "']").show();

    }

    function getSelectValue3(select3) {
        $("#select1 option[value='" + select3 + "']").hide();
        $("#select1 option[value!='" + select3 + "']").show();
        $("#select2 option[value='" + select3 + "']").hide();
        $("#select2 option[value!='" + select3 + "']").show();

        
    }

Solution

  • I created a single function that handles unhiding and hiding of all options, then filters the other dropdowns' options based on all selected values. Here's the function/demo:

    function hideOthers() {
      // Get all selected values
      let selectedValues = $(".form-control option:selected").map(function() {
        if (this.value.length === 0) {
          return null;
        }
        return this.value;
      });
      // Unhide all so we can hide the correct ones
      $("select.form-control option").removeAttr('hidden');
    
      // Filter out the selected values from dropdowns
      $(".form-control").each(function() {
        var selectElem = $(this);
        $.each(selectedValues, function(index, value) {
          // If the selected value from the array is from the applicable <select>, skip hiding
          if (selectElem.find("option:selected").val() !== value) {
            selectElem.find(`option[value="${value}"]`).attr('hidden', true);
          }
        });
      });
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <select id="select1" onchange="hideOthers()" class="form-control">
      <option hidden selected></option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
      <option value="5">5</option>
    </select>
    
    <select id="select2" onchange="hideOthers()" class="form-control">
      <option hidden selected></option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
      <option value="5">5</option>
    </select>
    
    <select id="select3" onchange="hideOthers()" class="form-control">
      <option hidden selected></option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
      <option value="5">5</option>
    </select>