Javascript 过滤对象数组,其中字段不完整

Javascript 过滤对象数组,其中字段不完整,javascript,reactjs,react-native,Javascript,Reactjs,React Native,我有以下数组 [ { "id": 1, "name": "Ruan Duarte", "idade": 11, "work": { "id": 2, "name": "React" } }, { "id": 2, "n

我有以下数组

[
  {
    "id": 1,
    "name": "Ruan Duarte",
    "idade": 11,
    "work": {
      "id": 2,
      "name": "React"
    }
  },
  {
    "id": 2,
    "name": "Raul Dias",
    "idade": 13
  },
  {
    "id": 7,
    "name": "Caio Ribeiro",
    "idade": 60,
    "work": {
      "id": 4,
      "name": "Rails"
    }
  },
  {
    "id": 3,
    "name": "Felipe Lima",
    "idade": 55
  },
  {
    "id": 4,
    "name": "Camila",
    "idade": 25,
    "work": {
      "id": 3,
      "name": "Phyton"
    }
  }
]
我有一个这种格式的数组,其中某些角落的work.name字段为空。我尝试按如下方式进行过滤

array.filter((i) => {
  return (
    i.work.name.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "")
      .includes(search.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""))
  )
})
记住,我有一个要搜索的输入,在状态下,它的值设置为search

但是,我得到一个错误,因为该字段未填充

请尝试此解决方案

array.filter((i) => {
  return (
    i.work && i.work.name && i.work.name.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "")
      .includes(search.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""))
  )
})

您可以在
filter
callback上为对象值添加验证

这里,
i?.work=i?i、 工作:未定义

const数组=[
{
“id”:1,
“姓名”:“阮·杜阿尔特”,
“idade”:11,
“工作”:{
“id”:2,
“名称”:“反应”
}
},
{
“id”:2,
“姓名”:“劳尔·迪亚斯”,
“idade”:13
},
{
“id”:7,
“姓名”:“Caio Ribeiro”,
“idade”:60,
“工作”:{
“id”:4,
“名称”:“Rails”
}
},
{
“id”:3,
“姓名”:“菲利佩·利马”,
“idade”:55
},
{
“id”:4,
“姓名”:“卡米拉”,
“idade”:25,
“工作”:{
“id”:3,
“名称”:“植物”
}
}
]
常量搜索='Phy';
console.log(array.filter)(i)=>{
返回(
i?.work?.name?.toLowerCase().normalize(“NFD”).replace(/[\u0300-\u036f]/g,”)
.includes(search.toLowerCase().normalize(“NFD”).replace(/[\u0300-\u036f]/g,”))
)
}));

可选链接-

您希望项目不包含链接,还是相反?请尝试使用。我想留下我的链接,以获得完整的示例。德里克回答得更快。
array.filter(i =>
    i?.work?.name?.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "")
      .includes(search.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""))
);