Javascript数据的Javascript过滤器,深度为2级或更高级别

时间:2018-01-14 17:02:32

标签: javascript json node.js rest express

我正在使用Express中的API来过滤JSON文件,该文件包含使用路由发送的查询字符串的事件。

我的JSON文件具有以下结构

{ "events": [
   {
     "venue": {
          "name": "Name of Venue",
          "address": "Address of Venue
              }
    }]
 }

我想在QueryString中放置场地名称并过滤对象,所以像这样

app.get('/api/events', function(req, res){
  var response = [];
  const { venue=null } = req.query;
  console.log(req.query);


 if (venue) {
  eventdata.filter((event) => {
   if(event.venue.name === venue){
    response.push(event);
  }
 });
}

// in case no filtering has been applied, respond with all venues
  if(Object.keys(req.query).length === 0){
    response = eventdata;
  }

  res.json(response);
});

但我认为,因为场地名称在对象的2层深处,所以没有创建匹配。我收到错误

Cannot read property 'name' of undefined

如果我没有输入查询字符串,我会得到所有结果。

如果我使用localhost:3000 / api / events?venue = abc%20bar我收到错误。

我猜测它与"名称"的深度有关。 JSON中的键/值对,但我不确定。即行

if(event.venue.name === venue)

有什么想法吗?感谢

2 个答案:

答案 0 :(得分:0)

你可以这样做:

  **if(event.venue && event.venue.name) {

    }**

您可以进行嵌套检查,以免遇到错误(无法读取未定义的名称)

答案 1 :(得分:0)

那不是filter的工作方式。里面的函数应该返回一个布尔值,表示是否应保留该元素。

类似

var response = eventdata.filter((evt) => {
    return evt.venue && evt.venue.name && evt.venue.name == venue;
});