Javascript 尝试使用Array.prototype.filter访问嵌套对象字段时出现未定义错误

Javascript 尝试使用Array.prototype.filter访问嵌套对象字段时出现未定义错误,javascript,Javascript,我使用下面的查询从模型中获取所有表单 query = await Form.find({}).populate('assigned_to'); 查询结果如下: [{ ** Some Other Fields ** assigned_to: { links: [Array], _id: 5 d7a903d8b8f3e0ced2dd308, name: 'Test E 2',

我使用下面的查询从模型中获取所有表单

query = await Form.find({}).populate('assigned_to');
查询结果如下:

[{
        **
        Some Other Fields **
        assigned_to: {
            links: [Array],
            _id: 5 d7a903d8b8f3e0ced2dd308,
            name: 'Test E 2',
            email: 'te2@somedomain.com',
            school: 5 d79e99b4d4df989ea771525,
            department: 5 d79e99b4d4df989ea771526,
            role: 'some_role',
            __v: 0
        },
    }, 
      **
    OTHER OBJECT 
      **
]
运行Array.prototype.filter

waiting = query.filter(form =>
form.assigned_to._id == req.user._id);
尝试访问指定给的嵌套对象的属性_id时返回错误为

无法读取未定义的属性“id”

我理解错误的本质是,并非所有窗体都同时向嵌套对象分配了一个_,这将导致该错误,因为仅在包含嵌套对象的窗体上运行筛选器

如何改进此过滤器,以满足并非所有窗体都已将_指定给嵌套对象的可能性


编辑:为了简洁起见,我最初并没有指出它是一个对象数组。

回答您的问题:我如何改进此过滤器以满足表单没有为嵌套对象指定_的可能性?。确保查询返回一个数组

这将确保分配给的密钥是否存在。您可以使用如下筛选方法:-

arr.filter(elem => (elem.assigned_to && elem.assigned_to._id &&
elem.assigned_to._id === req.user._id));
另一种方式

arr.filter(elem => {
  if(elem.assigned_to && elem.assigned_to._id) {
    if (elem.assigned_to._id === req.user._id) {
      return elem;
    }
  }
});

查询是一个对象。没有对象筛选器方法。您显示的查询似乎不是数组。你是说数组元素的形式是这样的吗?您是否确保所有查询都有一个分配给与之关联的对象的_?我最初没有指出它是一个对象数组,因为我说我使用的是array.prototype.filter,但是我已经编辑了查询结果,以表明该错误意味着某些结果没有指定\u to属性。是否应该在\u id值周围加引号?。在需要的情况下运行示例。谢谢:非常感谢。我尝试了一个像你一样的条件,但我没有包括if,only条件返回x。