Append and Populate dropdown list multiple javascript

Issue

Is this possbile to transpose this into multiple value just like in the image. Whenever I click another item it will append to another list in sub-region depends on region list data for example in Region, I select first region which is Agusan Del norte then it will pop up those list in sub-region under agusan del norte, then when I select another item in Region like Agusan Del Sur it will append list to sub-region. It is possible?
It would be great if anybody could figure out where I am doing something wrong. thank you so much in advance.

Reference: link

enter image description here

<select class="select2-icons form-control" name = "list1"  id="list1" multiple="multiple" onchange="updateList('list2', this);"></select>
let data = [{"id":1,"name":"USA","parentid":0},
{"id":2,"name":"Japan","parentid":0},
{"id":3,"name":"Europe","parentid":0},
{"id":4,"name":"California","parentid":1},
{"id":5,"name":"Oklahoma","parentid":1},
{"id":6,"name":"Arizona","parentid":1},
{"id":7,"name":"Kantô","parentid":2},
{"id":8,"name":"Kansai","parentid":2},
{"id":9,"name":"Chügoku","parentid":2},
{"id":10,"name":"France","parentid":3},
{"id":11,"name":"Deutschland","parentid":3},
{"id":12,"name":"Espana","parentid":3},
{"id":13,"name":"Sacramento","parentid":4},
{"id":14,"name":"Los Angeles","parentid":4},
{"id":15,"name":"San Diego","parentid":4},
{"id":16,"name":"Tulsa","parentid":5},
{"id":17,"name":"Oklahoma City","parentid":5},
{"id":18,"name":"Lawton","parentid":5},
{"id":19,"name":"Phoenix","parentid":6},
{"id":20,"name":"Flagstaff","parentid":6},
{"id":21,"name":"Tucson","parentid":6},
{"id":21,"name":"Tokyo","parentid":7},
{"id":22,"name":"Chiba","parentid":7},
{"id":23,"name":"Tochigi","parentid":7},
{"id":24,"name":"Kyoto","parentid":8},
{"id":25,"name":"Osaka","parentid":8},
{"id":26,"name":"Nara","parentid":8},
{"id":27,"name":"Tottori","parentid":9},
{"id":28,"name":"Hirochima","parentid":9},
{"id":29,"name":"Okayama","parentid":9},
{"id":30,"name":"Quimper","parentid":10},
{"id":31,"name":"Toulouse","parentid":10},
{"id":32,"name":"Nancy","parentid":10},
{"id":33,"name":"Dusseldorf","parentid":11},
{"id":34,"name":"Leipzig","parentid":11},
{"id":35,"name":"Munchen","parentid":11},
{"id":36,"name":"Barcelona","parentid":12},
{"id":37,"name":"Sevilla","parentid":12},
{"id":38,"name":"Guernica","parentid":12}]

function populateList(list, pid) {
  let l = document.getElementById(list);
  l.innerHTML = "";
  let topItem = document.createElement("option");
  topItem.value = 0;
  topItem.text = "--Select--";
  l.appendChild(topItem); 
  let items = data.filter(item => item.parentid == pid);
  items.forEach(function(item){
    let newItem = document.createElement("option");
    newItem.value = item.id;
    newItem.text = item.name;
    l.appendChild(newItem);
  })
}

function updateList(selList, thisList) {
  if (thisList.value != 0) {
    populateList(selList, Number(thisList.value));
  } else {
    let s = document.getElementById(selList);
    s.value = 0;
    triggerEvent(s, "onchange");
    let sCopy = s.cloneNode(false);
    let p = s.parentNode;
    p.replaceChild(sCopy, s);
  }
}
function triggerEvent(e, trigger)
{
    if ((e[trigger] || false) && typeof e[trigger] == 'function')
    {
        e[trigger](e);
    }
}
 

function loadList1() {
  populateList("list1", 0);
}

window.onload = loadList1;
select {width:150px;}
Region: <select id="list1" onchange="updateList('list2', this);"></select>
Sub-region:<select id="list2" onchange="updateList('list3', this);"></select>>
Location:<select id="list3"></select>

Solution

    let data = [{"id":1,"name":"USA","parentid":0},
    {"id":2,"name":"Japan","parentid":0},
    {"id":3,"name":"Europe","parentid":0},
    {"id":4,"name":"California","parentid":1},
    {"id":5,"name":"Oklahoma","parentid":1},
    {"id":6,"name":"Arizona","parentid":1},
    {"id":7,"name":"Kantô","parentid":2},
    {"id":8,"name":"Kansai","parentid":2},
    {"id":9,"name":"Chügoku","parentid":2},
    {"id":10,"name":"France","parentid":3},
    {"id":11,"name":"Deutschland","parentid":3},
    {"id":12,"name":"Espana","parentid":3},
    {"id":13,"name":"Sacramento","parentid":4},
    {"id":14,"name":"Los Angeles","parentid":4},
    {"id":15,"name":"San Diego","parentid":4},
    {"id":16,"name":"Tulsa","parentid":5},
    {"id":17,"name":"Oklahoma City","parentid":5},
    {"id":18,"name":"Lawton","parentid":5},
    {"id":19,"name":"Phoenix","parentid":6},
    {"id":20,"name":"Flagstaff","parentid":6},
    {"id":21,"name":"Tucson","parentid":6},
    {"id":21,"name":"Tokyo","parentid":7},
    {"id":22,"name":"Chiba","parentid":7},
    {"id":23,"name":"Tochigi","parentid":7},
    {"id":24,"name":"Kyoto","parentid":8},
    {"id":25,"name":"Osaka","parentid":8},
    {"id":26,"name":"Nara","parentid":8},
    {"id":27,"name":"Tottori","parentid":9},
    {"id":28,"name":"Hirochima","parentid":9},
    {"id":29,"name":"Okayama","parentid":9},
    {"id":30,"name":"Quimper","parentid":10},
    {"id":31,"name":"Toulouse","parentid":10},
    {"id":32,"name":"Nancy","parentid":10},
    {"id":33,"name":"Dusseldorf","parentid":11},
    {"id":34,"name":"Leipzig","parentid":11},
    {"id":35,"name":"Munchen","parentid":11},
    {"id":36,"name":"Barcelona","parentid":12},
    {"id":37,"name":"Sevilla","parentid":12},
    {"id":38,"name":"Guernica","parentid":12}]

    function populateList(list, pids) {
      let l = document.getElementById(list);
      l.innerHTML = "";
      let topItem = document.createElement("option");
      topItem.value = 0;
      topItem.text = "--Select--";
      l.appendChild(topItem); 
      let items = data.filter(item =>  pids.includes(item.parentid));
      items.forEach(function(item){
        let newItem = document.createElement("option");
        newItem.value = item.id;
        newItem.text = item.name;
        l.appendChild(newItem);
      })
    }

    function updateList(selList, thisList) {
        let values = [];
        for(let i=0;i<thisList.selectedOptions.length; i++) values.push(parseInt(thisList.selectedOptions[i].value))
      if (values.length>0 && values[0] != 0) {
        populateList(selList, values);
      } else {
        let s = document.getElementById(selList);
        s.value = 0;
        triggerEvent(s, "onchange");
        let sCopy = s.cloneNode(false);
        let p = s.parentNode;
        p.replaceChild(sCopy, s);
      }
    }
    function triggerEvent(e, trigger)
    {
        if ((e[trigger] || false) && typeof e[trigger] == 'function')
        {
            e[trigger](e);
        }
    }
     

    function loadList1() {
      populateList("list1", [0]);
    }

    window.onload = loadList1;
select {width:150px;}
    Region: <select id="list1" onchange="updateList('list2', this);" multiple="multiple"></select>
    Sub-region:<select id="list2" onchange="updateList('list3', this);" multiple="multiple"></select>
    Location:<select id="list3"></select>

Answered By – ramlalsharma1994

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published