2016-02-21 237 views
2

我有一个包含电影信息的对象数组。每个对象都有一个类型值。该值可以是字符串或数组。如何过滤javascript中的对象数组中的数组?

我从查询字符串中获取流派并将其保存到名为流派的变量中。现在我只想整理那种类型的电影。

我的对象的数组是这样的:

movies = [ 
      { 
       title:"Apocalypse Now", 
       year: "1979", 
       genre: [ 
        "drama", 
        "war" 
       ] 
      }, 
      { 
       title:"Unforgiven", 
       year: "1992", 
       genre: [ 
        "western", 
        "drama" 
       ] 
      }, 
      { 
       title: "The big Lebowski", 
       year: "1998", 
       genre: "comedy" 
      } 
]; 

现在我已经找到一个可行的解决方案。但我不满意它,因为:

  1. 它不允许为每部电影超过3种类型。

  2. 它看起来不漂亮,不能与其他代码组合。而且我认为必须有更好的方式,但我找不到它。

这是我现在有:

var genre = req.query.genre; 
var movies = data.movies; 
var filtered = movies.filter(function(x){ 
    return x.genre == genre || x.genre[0] == genre || x.genre[1] == genre || x.genre[2] == genre; 
     }); 

回答

1

只需使用indexOf()

var genre = req.query.genre; 
var movies = data.movies; 
var filtered = movies.filter(function(x){ 
    return x.genre.indexOf(genre) > -1; 
}); 
3

因为x可以是一个字符串或数组是测试平等一件简单的事情,如果它是一个字符串,或使用的indexOf如果它是一个数组

var genre = req.query.genre; 
var movies = data.movies; 
var filtered = movies.filter(function(x){ 
    return typeof x == "string" ? x == genre : x.indexOf(genre) >= 0; 
}); 

注:现代浏览器,你可以使用

 return typeof x == "string" ? x == genre : x.includes(genre); 
+0

想想搜索像ABC流派。如果你在字符串上使用indexof,它会发现abcdef –

+0

哦,你说得对!我没那么想.. – baao

-1

我会改变你设置数据的方式,即使它只是一个值,将所有的东西都设为一个字符串数组。它应该是一致的。如果您使用es6或7,则可以使用箭头功能。通过这种方式,您可以使用尽可能多的类型,而不仅仅是最多3种。

for(let i = 0; i < movies.length; i++){ 
    `var genre = movies[i].genre.filter(x => x.genre == "comedy");` 
//do something with the value 
    } 
相关问题