【问题标题】:Comparing the two objects in an array with variables to display the third object将数组中的两个对象与变量进行比较以显示第三个对象
【发布时间】:2018-06-21 12:29:10
【问题描述】:

我有一个数组“languageCodes”。我必须将对象“ssmlGender”和“languageCodes”分别与变量“genderSelected”和“languageSelected”进行比较。如果两者都是真的,我必须显示数组的相应“名称”字段。我确实尝试使用 forEach 进行两级过滤并将值存储在数组中。但是,只得到了一个空的。

let languageCodes = [
{ languageCodes: ['es-ES'], name: 'es-ES-Standard-A', ssmlGender: 'FEMALE', naturalSampleRateHertz: 2403},
{languageCodes: ['it-IT'], name: 'it-IT-Standard-A', ssmlGender: 'MALE', naturalSampleRateHertz: 21000},
{languageCodes: ['ja-JP'], name: 'ja-JP-Standard-A', ssmlGender: 'FEMALE', naturalSampleRateHertz: 3200},
{languageCodes: ['ko-KR'], name: 'ko-KR-Standard-A', ssmlGender: 'MALE', naturalSampleRateHertz: 2330},
{languageCodes: ['en-US'], name: 'en-US-Wavenet-B', ssmlGender: 'FEMALE', naturalSampleRateHertz: 412},
{languageCodes: ['en-GB'], name: 'en-GB-Standard-A', ssmlGender: 'MALE', naturalSampleRateHertz: 8493}
];

我的 JavaScript 函数:

function changeVoiceNameOption() {
            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>`
            })
            }

【问题讨论】:

    标签: javascript arrays foreach javascript-objects


    【解决方案1】:

    这行看起来不正确:

    languageCodes.filter(( item ) => {
        return item.languageCodes.includes(genderSelected);
    })
    

    您正在根据性别选择过滤语言,这将返回一个空数组

    加上在你返回的forEach中再尝试push,nameArray.push永远不会发生

    【讨论】:

    • 感谢您指出这一点。与相同的数组名称和对象名称混淆。现在我已经改变了数组。仍然无法获得输出。
    【解决方案2】:

    过滤可以通过简化的方式完成。假设声明了 genderSelected 变量,这应该可以工作:

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

    【讨论】:

    • 非常感谢。有效。您能否在const filteredItems = languageCodes.filter(({languageCodes: langs, ssmlGender: gender}) =&gt; langs[0] === languageSelected &amp;&amp; gender === genderSelected) 这一行解释一下这里的操作 - 为什么我们声明 langs[0] 而不是将性别作为性别 [0]?
    • @srikha:'langs' 是语言代码的别名,它是您的示例中给出的数组,因此我们使用 [0] 访问它。 ‘gender’ 是 ssmlGender 的别名,它是一个字符串,我们可以直接访问它。别名是作为 ES6 对象分配解构的一部分完成的。 filter 函数只检查两个条件:langs 数组中的第一项是否等于选定的一项,以及性别是否等于指定的一项
    • 酷。现在,我明白了。感谢您的明确解释。
    猜你喜欢
    • 2020-07-31
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多