javascript 当newNameObject已经存在于数组中时,为什么我的console.log(persons.includes(newNameObject))返回false?[duplicate]

kq0g1dla  于 2023-01-29  发布在  Java
关注(0)|答案(1)|浏览(74)
    • 此问题在此处已有答案**:

How to determine if Javascript array contains an object with an attribute that equals a given value?(27个答案)
昨天关门了。
我正在开发一个简单的react应用程序,希望防止表单向对象数组添加重复的元素
我有两个状态示例

const [persons, setPersons] = useState([
    { name: 'Arto Hellas' }
  ]) 
 const [newName, setNewName] = useState('')

在输入更改时设置新名称的函数

function handleNoteChange(e){
console.log(e.target.value)
setNewName(e.target.value)
  }

一个函数用于在提交表单时向数组添加新元素

function addName(e){
     const newNameObject = {
       name: newName
     }
     console.log(persons.includes(newNameObject))
     e.preventDefault()
     setNewName("") 
if(persons.includes(newNameObject) ){
  alert(`${newName} has already been added`)
  
}
else{
  setPersons(persons.concat(newNameObject))
}
  }

我有一个console.log,我在其中检查我输入的当前名称("Arto Hellas")是否已经在persons数组中,它在应该为真的时候说这是假,因为这是迄今为止我状态中的第一个也是唯一的项目,不确定发生这种情况的确切原因

vptzau2j

vptzau2j1#

它返回false,因为include是基于引用而不是每个对象的值进行比较的。
要解决您的用例,您必须手动迭代数组中的每个对象,并与所需的元素进行对象比较,如下所示。

function containsObject(searchElement, actualArray) {
    var isObjectPresent = true;
    for(var i = 0; i < actualArray.length; i++) {
        if(JSON.stringify(actualArray[i]) != JSON.stringify(searchElement)) {
            isObjectPresent = false;
            break;
        }
    }
    return isObjectPresent;
}

注意:此方法仅在属性顺序相同时有效

相关问题