2016-02-21 137 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 
    } 
相關問題