繁体   English   中英

使用JavaScript创建带有对象数组的三级依赖下拉列表

[英]Creating the three level dependent drop-down list with array of objects using JavaScript

我正在从我从API(动态数据)获取的对象数组中创建三级下拉列表。 我尝试从ssmlGender(语音性别)字段中删除重复的值,并尝试了其他方法。 但是,无法获取正确的数据。

在第一个下拉列表中,我显示“ ssmlGender”字段中的性别:“女性”和“男性”。 当用户在第一个下拉列表中选择男性或女性时,必须在第二个下拉列表中填充特定性别可用的“ languageCodes”。 选择语言代码后,应显示具有所选性别和语言代码的“名称”字段。

样本数组:

0: {languageCodes: Array(1), name: "es-ES-Standard-A", ssmlGender: "FEMALE", naturalSampleRateHertz: 24000}
1:
{languageCodes: Array(1), name: "it-IT-Standard-A", ssmlGender: "FEMALE", naturalSampleRateHertz: 24000}
2:
{languageCodes: Array(1), name: "ja-JP-Standard-A", ssmlGender: "FEMALE", naturalSampleRateHertz: 22050}
3:
{languageCodes: Array(1), name: "ko-KR-Standard-A", ssmlGender: "FEMALE", naturalSampleRateHertz: 22050}
8:{languageCodes: Array(1), name: "en-US-Wavenet-D", ssmlGender: "MALE", naturalSampleRateHertz: 24000}
9:
{languageCodes: Array(1), name: "en-US-Wavenet-A", ssmlGender: "MALE", naturalSampleRateHertz: 24000}
10:
{languageCodes: Array(1), name: "en-US-Wavenet-B", ssmlGender: "MALE", naturalSampleRateHertz: 24000}
11:
{languageCodes: Array(1), name: "en-US-Wavenet-C", ssmlGender: "FEMALE", naturalSampleRateHertz: 24000}
12:
{languageCodes: Array(1), name: "en-US-Wavenet-E", ssmlGender: "FEMALE", naturalSampleRateHertz: 24000}
13:
{languageCodes: Array(1), name: "en-US-Wavenet-F", ssmlGender: "FEMALE", naturalSampleRateHertz: 24000}
14:
{languageCodes: Array(1), name: "en-GB-Standard-A", ssmlGender: "FEMALE", naturalSampleRateHertz: 24000}
15:
{languageCodes: Array(1), name: "en-GB-Standard-B", ssmlGender: "MALE", naturalSampleRateHertz: 24000}

当我们单击特定数组时,它将显示此链接中给出的数据: https : //imgur.com/HfQ3bsw

我的HTML:

 <div class="row">
                <label>Voice Gender</label>
                <div class="input-field col s12">                    
                    <select id="gender">
                            <option value="" selected>Choose your option</option>                                                     
                            </select>
                </div>
        </div>

        <div class="row">
                <label>Voice Language</label>
                <div class="input-field col s12">
                    <select id="languages">
                        <option value="" selected>Choose your languages</option>
                    </select>
                </div>
            </div>

        <div class="row">
                <label>Voice Name</label>
                <div class="input-field col s12">                    
                    <select id="entries">
                            <option value="" selected>Choose your option</option>                           
                            </select>
                </div>
        </div>

我的JavaScript:

for(var i=0;i<response.result.voices.length;i++){
         var values= response.result.voices;

            //To remove the duplicate value of "Male" and "Female" iteration and to display only once. 

            var valueArr = values.map(function(item){ return item.ssmlGender });
                    var isDuplicate = valueArr.some(function(item, idx){ 
                        return valueArr.indexOf(item) != idx 
                    });
                    console.log(isDuplicate);
$('#entries').append('<option value='+(i+1)+'>' + response.result.voices[i].name+ '</option>');


        //Added custom options of "MALE" AND "FEMALE" directly into the voice gender field of HTML to remove the duplicate values.But, it didn't work out. 

        /*if(document.getElementById("gender").value=="FEMALE"){
             if(response.result.voices[i].ssmlGender=="FEMALE")
               {
                 finalLanguages=response.result.voices[i].languageCodes;
                 }                            
               }
        if(document.getElementById("gender").value =="MALE"){
              if(response.result.voices[i].ssmlGender=="MALE")
                   {
                     finalLanguages=response.result.voices[i].languageCodes;
                     }
                  }                 
   $("#languages").append('<option value=' + (i+1)+ '>'+finalLanguages+ '</option>');*/
                          }

非常感谢。

 let languageCodes = [ { languageCodes: ['123'], name: 'es-ES-Standard-A', ssmlGender: 'FEMALE', naturalSampleRateHertz: 2403}, {languageCodes: ['214'], name: 'it-IT-Standard-A', ssmlGender: 'MALE', naturalSampleRateHertz: 21000}, {languageCodes: ['147'], name: 'ja-JP-Standard-A', ssmlGender: 'FEMALE', naturalSampleRateHertz: 3200}, {languageCodes: ['290'], name: 'ko-KR-Standard-A', ssmlGender: 'MALE', naturalSampleRateHertz: 2330}, {languageCodes: ['173'], name: 'en-US-Wavenet-B', ssmlGender: 'FEMALE', naturalSampleRateHertz: 412}, {languageCodes: ['583'], name: 'en-GB-Standard-A', ssmlGender: 'MALE', naturalSampleRateHertz: 8493} ]; // Register Change listeners function registerEventListeners() { document.getElementById('gender').addEventListener('change', changeVoiceLanguageOption, false); document.getElementById('languages').addEventListener('change', changeVoiceNameOption, false); } function changeVoiceNameOption() { const valueSelected = document.getElementById('languages').value; let entriesElement = document.getElementById('entries'); entriesElement.innerHTML = ''; entriesElement.innerHTML += '<option value="" selected>Choose your option</option>' languageCodes.filter(( item ) => { return item.languageCodes.includes(valueSelected); }).forEach(( item ) => { entriesElement.innerHTML += `<option value="${item.name}"> ${item.name} </option>` }) } function changeVoiceLanguageOption() { const valueSelected = document.getElementById('gender').value; let languageElement = document.getElementById('languages'); languageElement.innerHTML = ''; // This is what prevents duplication languageElement.innerHTML += '<option value="" selected>Choose your languages</option>' languageCodes.filter(( item ) => { return item.ssmlGender === valueSelected; }).forEach(( filteredItems ) => { filteredItems.languageCodes.forEach(( languageCode ) => { languageElement.innerHTML += `<option value="${languageCode}"> ${languageCode} </option>` }) }) } function populateGender() { let genderElement = document.getElementById('gender'); let genderObject = {}; languageCodes.forEach(( item ) => { genderObject[item.ssmlGender] = ''; }) Object.keys(genderObject).forEach(( item ) => { genderElement.innerHTML += `<option value="${item}"> ${item} </option>` }) } registerEventListeners(); populateGender(); 
 <div class="row"> <label>Voice Gender</label> <div class="input-field col s12"> <select id="gender"> <option value="" selected>Choose your option</option> </select> </div> </div> <div class="row"> <label>Voice Language</label> <div class="input-field col s12"> <select id="languages"> <option value="" selected>Choose your languages</option> </select> </div> </div> <div class="row"> <label>Voice Name</label> <div class="input-field col s12"> <select id="entries"> <option value="" selected>Choose your option</option> </select> </div> </div> 

还有其他方法可以同时比较“语言”和“性别”字段并根据其显示结果吗?

我已经像这样重写了changeVoiceNameOption()。 我无法得到结果。

        function changeVoiceNameOption() {
genderSelected=document.getElementById('gender').value;
        const languageSelected = document.getElementById('languages').value;
        let entriesElement = document.getElementById('entries');
        entriesElement.innerHTML = '';
        entriesElement.innerHTML += '<option value="" selected>Choose your option</option>'
        var nameArray=[];
    languageCodes.filter(( item ) => {
    return item.ssmlGender.includes(genderSelected);
    }).forEach(( filteredItems ) =>  {filteredItems.languageCodes.forEach(( languageCode ) => {return filteredItems.languageCodes.includes(languageSelected);                        
    })
     }).forEach(( filteredItems ) =>  {
    entriesElement.innerHTML += `<option value="${item.name}"> ${item.name} </option>`
    })
     }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM