APIでデータをフェッチしています。映画、テレビ番組、人物データベースです。検索ボックスで単語を検索すると、関連する映画、テレビ番組、人物の名前が配列にネストされたオブジェクトで返されます。たとえば、「fight」を検索すると、次のようになります。
[
0:{original_name: "쌈 마이웨이", id: 70813, media_type: "tv", name: "Fight My Way", vote_count: 5,…}
1:{vote_average: 8.2, vote_count: 8057, id: 550, video: false, media_type: "movie", title: "Fight Club",…}
2:{vote_average: 6.1, vote_count: 215, id: 345922, video: false, media_type: "movie",…}
3:{original_name: "Fight", id: 46554, media_type: "tv", name: "Fight", vote_count: 0, vote_average: 0,…}
4:{original_name: "The Good Fight", id: 69158, media_type: "tv", name: "The Good Fight", vote_count: 22,…}
5:{vote_average: 0, vote_count: 0, id: 158301, video: false, media_type: "movie", title: "Fight",…}
]
より多くの結果がありますが、私はそれらを切りました。ご覧のとおり、各オブジェクトにはmedia_type
プロパティがあります。あなたが理解できるように3つのメディアタイプがあります(映画、テレビ、人)。それぞれの種類を数えたい。
実際;私は推測するリンクに同じことを望みます: React:Switch ReturnでsetStateを呼び出すための構文
しかし、それは私にはうまくいきません。私はmovieCountの状態を次のように3に変更しようとしました:
countType() {
this.props.movies.map(movie => {
return() => {
if(movie.media_type === 'movie') {
this.setState({ movieCount: 3});
console.log(this.state);
}
}
});
}
しかし、それはあまりにも機能しません。私は、JavaScriptのドキュメントやフォーラムでインターネット上でこれについて調査しました。ただ反応するだけではありません。でも何もできませんでした。私はそれが簡単であることを知っています。
それでは、プロパティタイプに従って配列内のオブジェクトをどのようにカウントできますか?
わかりました、solitionを見つけました。回答をありがとうございます。私は彼の答えを通してそれを解決しました。
countType(type) {
const countTypes = this.props.movies.filter(movie => movie.media_type === type);
return countTypes.length;
}
テレビの結果をレンダリングしている間、上記のメソッドをtypeで呼び出すだけです。例えば:
return (
<div>
movie count: {this.countType('movie')}
tv show count: {this.countType('tv')}
</div>
);
APIからフェッチしたデータがdata
変数に格納されていると仮定すると、次のコードを試して、データ配列内のmovie
メディアタイプの数を見つけることができます。
const movies = data.filter(item => item.media_type === 'movie')),
moviesCount = movies.length;
データ配列内のすべてのmedia_type
の数を動的に計算することもできます。
const mediaTypes = data
.map(dataItem => dataItem.media_type) // get all media types
.filter((mediaType, index, array) => array.indexOf(mediaType) === index), // filter out duplicates
counts = mediaTypes
.map(mediaType => ({
type: mediaType,
count: data.filter(item => item.media_type === mediaType).length
}));
その場合、counts
は次のようになります。
[
{
"type": "tv",
"count": 3
},
{
"type": "movie",
"count": 3
}
]
var data = [
{ original_name: "쌈 마이웨이", id: 70813, media_type: "tv", name: "Fight My Way", vote_count: 5 },
{ vote_average: 8.2, vote_count: 8057, id: 550, video: false, media_type: "movie", title: "Fight Club" },
{ vote_average: 6.1, vote_count: 215, id: 345922, video: false, media_type: "movie" },
{ original_name: "Fight", id: 46554, media_type: "tv", name: "Fight", vote_count: 0, vote_average: 0 },
{ original_name: "The Good Fight", id: 69158, media_type: "tv", name: "The Good Fight", vote_count: 22 },
{ vote_average: 0, vote_count: 0, id: 158301, video: false, media_type: "movie", title: "Fight" },
]
this.types = {};
data.forEach((d) => {
if (!this.types[d["media_type"]]) {
this.types[d["media_type"]] = 1;
} else {
this.types[d["media_type"]] += 1;
}
})
console.log(this.types);
// you will get answer { tv: 3, movie: 3 }