質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1721閲覧

forEachでの処理がうまくいきません(vue.js)

tenlife

総合スコア70

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/05/17 00:16

vue.js初心者です。

解決したいこと
いいね機能を実装しています。ユーザーがすでにいいねしている場合にはtrueを返したいです。

現状
trueが1つしか返ってこない。

1, firestoreからpostを全て取得 db.collection('items')

2, 現在ログインしているユーザーがいいねした投稿を取得 state.myfavs

3, 1で取得したpostのidと2で取得したidが一致するかどうか

4, 一致した場合はtrue,そうで無い場合はfalseを返すようにしています。

(今回のユーザーはposts全てにいいねしています)

getAll({commit, state}) { db.collection('posts').get().then(snapshot => { var tests = [] snapshot.forEach(doc => { const post = doc.data() post.id = doc.id state.myfavs.forEach(ele => { if(ele.id === post.id) { post.status = true } else { post.status = false } }) console.log('チェック', post) tests.push(post) }); commit('get', tests) }) },
console.log('チェック', post)の結果 {user_id: "TTNEIlVOz1coc4CfAWmCyND5kUO2", title: "おはよう", age: "11", id: "Ps2JPj9sH0uCJw9nYTDD", status: false} {user_id: "TTNEIlVOz1coc4CfAWmCyND5kUO2", title: "こんにちわ", age: "15", id: "oqTJKuIaN1UYqcpuJnrT", status: true}

確認したこと
itemとstate.myfavsの関係
post.idは取れてるか? yes
ele.idは取れてるか? yes
console.log('チェック', post)でpostのstatusでtrueが返ってきているか。 no
本来であればtrueの値で2つほどデータが帰ってき欲しいのですが、1つはfalse、もう1つはtrueになって返ってきてしまいます

仮説
forEachを2ヶ所使用(重なっている)しているのが怪しいと思っているのですが、解決できませんでした。

どなたか知恵を貸していただきたいです。
よろしくおねがします。

vue 2.6.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

state.myfavs.forEach(ele => { if(ele.id === post.id) { post.status = true } else { post.status = false } })

forEachだと全件に対して処理をします。
同じIDのものがあって、trueになったあとも処理が続き、次の判定でfalseになってしまいます。

some を利用してみてはいかがでしょうか?
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some
同じものが一つでもあればtrueを返す関数です。

投稿2020/05/17 08:34

ymneet

総合スコア154

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tenlife

2020/05/17 21:15 編集

回答ありがとうございます!!! someは初めて出会いました。とても参考になり、勉強になりました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問