Javascript 如何验证筛选方法中的属性是否为null

Javascript 如何验证筛选方法中的属性是否为null,javascript,angular,Javascript,Angular,我有一个对象列表,我必须按id和名称搜索它们。我的一些对象有“name”:null,我得到一个错误 无法读取null的属性“includes” 我试过了 if (r.name !== null) { } 但是这不是正确的语法你试过这个吗 if (r.name) {} 如果没有if,您只需编写: && (r.name !== null) 在表达式中,编译器将接受它,或者您可以按如下方式使用筛选器: .filter( (item) => { if (whatever

我有一个对象列表,我必须按id和名称搜索它们。我的一些对象有“name”:null,我得到一个错误

无法读取null的属性“includes”

我试过了

if (r.name !== null) {

}
但是这不是正确的语法

你试过这个吗

if (r.name) {}

如果没有if,您只需编写:

&& (r.name !== null)
在表达式中,编译器将接受它,或者您可以按如下方式使用筛选器:

.filter( (item) => {
  if (whatever_condition) {
    return item;
}
});
您只需执行以下操作:

Object.keys(result).forEach(key => {
      if (this.filters.searchBy && this.filters.searchBy.length) {
        result[key] = result[key].filter(r => r && 
          (r.id && this.filters.searchBy.includes(r.id)) ||
          (r.name && r.name.includes(this.filters.searchBy)));
      }
    });

可选的链接和箭头功能

您可以使用“.”来避免检查属性的空值。此外,还可以使用箭头函数在JavaScript中轻松过滤数组

下面是一些示例代码:

让列表=[ {姓名:'John Smith',年龄:13}, {姓名:'Peter Jones',年龄:23}, {姓名:'Jane Doe',年龄:54}, {姓名:空,年龄:12}, {年龄:72} ]; 让结果=list.filteri=>{ 回来 i、 名称?.startsWithJ&& i、 年龄<40 }; console.logresult; //只返回约翰·史密斯 没有可选的链接

正如Makyen指出的,您可能无法向我们提供可选链接。在这种情况下,您可以在使用前检查每个字段,如下所示

让列表=[ {姓名:'John Smith',年龄:13}, {姓名:'Peter Jones',年龄:23}, {姓名:'Jane Doe',年龄:54}, {姓名:空,年龄:12}, {年龄:72} ]; 让结果=list.filteri=>{ 回来 i、 name&&//如果“name”为空,条件将很快失败 i、 name.startsWithJ&& i、 年龄<40 }; console.logresult; //只返回约翰·史密斯 我在另一个问题上找到了一个函数,它允许您轻松地检查嵌套对象。我稍微修改了它以检查嵌套字段

函数getobj,键{ 返回键。拆分..EveryFunction X{ iftypeof obj!=对象| | obj===null | | |!obj中的x!obj[x] 返回false; obj=obj[x]; 返回true; }; } 让列表=[ { 姓名:{ 姓:“约翰”,姓“史密斯” }, 年龄:13 }, { 姓名:{ firstName:null,lastName:'Jones' }, 年龄:23 }, { 姓名:{ 姓:“琼斯” }, 年龄:46 } ]; 让结果=list.filteri=>{ 回来 geti,name.firstName&& i、 name.firstName.startsWithJ&& i、 年龄<40 }; console.logresult; //只返回约翰·史密斯 链接:

可选链接

Arrow函数——我写的一篇关于Arrow函数的好文章


您是否尝试过与!=,不是!==@Skywarth空对象可以通过严格的比较来检查,空===null返回true,您应该意识到,对于arrow函数,您可以编写x=>{},其中{}是一个BlockStatement。请复习不同的内容。还要注意,函数{}也可以工作。此注释与您的语法不正确有关,并且您的注释在筛选器方法中不能有if。
Object.keys(result).forEach(key => {
      if (this.filters.searchBy && this.filters.searchBy.length) {
        result[key] = result[key].filter(r => r && 
          (r.id && this.filters.searchBy.includes(r.id)) ||
          (r.name && r.name.includes(this.filters.searchBy)));
      }
    });