javascript - React 将唯一对象推送到数组中

标签 javascript reactjs

我有一个函数应该向数组添加唯一元素:

addLanguage = (val) => {

    for(let i=0; i< val.length; i++){
        console.log(val[i].id)
        if(this.state.createNewDeliveryData.languages.indexOf(val[i].id === -1)){
             this.state.createNewDeliveryData.languages.push(val[i])
        }
    }
}

参数“val”每次都会获取一个带有附加元素的数组(我在 UI 上有一个多选框,从中添加语言),这就是为什么在 If 循环中我试图检查我的语言数组是否已经具有该特定的元素。然而这没有效果,最后我的语言数组包含相同的元素,即在后续调用中添加相同的元素两次或三次等。

['German']
['German', 'German', 'Arabic']
...

我做错了什么?

最佳答案

您正在数组中查找 false 的索引。这是因为,indexOf(val[i].id === -1) 将始终检查 indexOf(false) 是否为 -1。所以你重新添加每种语言。

您可能正在寻找与此更相似的算法:

addLanguage = (val) => {
    // Get a copy of the languages state. 
    const languages = [...this.state.createNewDeliveryData.languages];
    for(let i=0; i< val.length; i++){
        if(languages.indexOf(val[i].id) === -1) { // notice that there is a parenthesis after `id`.
            languages.push(val[i].id)
        }
    }
    this.setState({createNewDeliveryData: {languages}}); // update state and trigger re-render if there are new languages. 
}

请注意,您应该始终使用 setState 来改变 React 中的状态。

关于javascript - React 将唯一对象推送到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45029396/

相关文章:

javascript - ReactJS 在 onClick 中传递对象而不是函数

javascript - 如何呈现 material-ui 输入控件而不是 materials-ui-datepicker 的文本字段

javascript - 如何映射从数据库中获取的元素?

javascript - 如何在 HTML5 Canvas 上绘制多边形?

javascript - Three.js 在对象上添加按钮以显示有关该位置的信息

javascript - 根据本地存储中的列表过滤 ng-repeat

reactjs - 如果在node_modules中有react和react-native,flow会提示

javascript - 如何在桌面 PWA 中显示拖放图像?

javascript - 将多个参数传递到单个参数

reactjs - 如何使用类型作为来自 axios.get 的响应