我有一组包含有关电影信息的对象。每个对象都有一个类型的值。该值可以是字符串或数组。
我从查询字符串中获取一个类型并将其保存到名为genre的变量中。现在我只想整理那种类型的电影。
我的对象数组如下所示:
movies = [
{
title:"Apocalypse Now",
year: "1979",
genre: [
"drama",
"war"
]
},
{
title:"Unforgiven",
year: "1992",
genre: [
"western",
"drama"
]
},
{
title: "The big Lebowski",
year: "1998",
genre: "comedy"
}
];
现在我找到了一个有效的解决方案。但我对此并不满意,因为:
每部电影不允许超过3种类型。
它看起来不漂亮,并且不能很好地与其他代码合作。而且我认为必须有更好的方法,但我无法找到它。
以下是我现在所拥有的:
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;
});
答案 0 :(得分: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);
答案 1 :(得分:1)
只需使用indexOf()
var genre = req.query.genre;
var movies = data.movies;
var filtered = movies.filter(function(x){
return x.genre.indexOf(genre) > -1;
});
答案 2 :(得分:-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
}