実現したいこと
jsの変数を下記のような形でnullかどうか判定してnullではない変数の中身を変数resに代入する方法で、配列型変数の時に空の判定がうまくできずに困っています。
js
1let a; 2let b = 1; 3const res = a | b | {} 4console.log(res) 5//=> b: 1 6 7let c = 2; 8let d; 9const res2 = c | d | {} 10console.log(res2) 11//=> c: 2 12 13let e; 14let f; 15const res3 = e | f | {} 16console.log(res3) 17//=> 0 18 19// ## ここの判定について 20let arr = []; 21let arr2 = [{id: 1, name: 'apple'}] 22const res4 = arr | arr2 | {} 23console.log(res4) 24// 現状: => 0 25// 求めている答え: => arr2: {id: 1, name: 'apple'}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
そもそも論として、|
演算は数値用です(MDN)。
そして、[]
はtruthyなので、「length
が0かどうか」をチェックするなど、相応の手間をかけるより他に方法はありません。
投稿2020/08/27 05:27
総合スコア146018
0
ベストアンサー
まず、またはの論理演算は、||
というように、ヴァーティカルライン二本で結ぶのが正しいです。
さて、配列変数に関しては、宣言時、代入の時点で初期化してしまうと、変数単体では真となりますので、
配列変数の長さで、比較演算してはいかがでしょうか?
また、変数がオブジェクトかどうか(配列はオブジェクトになる)の比較も追加しました。
javascript
1let arr = []; 2let arr2 = [{id: 1, name: 'apple'}]; 3const res4 = (typeof arr == 'object' && arr.length > 0 ? arr : null) || (typeof arr2 == 'object' && arr2.length > 0 ? arr2 : null) || {}; 4console.log(res4);
投稿2020/08/27 05:32
編集2020/08/27 06:18総合スコア9555
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/27 05:54
2020/08/27 05:59
2020/08/27 06:13
2020/08/27 06:14
2020/08/27 06:17
0
OR演算子に対する回答は既出ですので割愛します
配列の空の判定
配列要素を取得したいときは、配列操作するしかありません。
length プロパティは String や HTMLCollection など、多くのオブジェクトが持っていますので、
条件に対し真なら配列を、偽ならfalsyを返却するユーザ関数を書くのが条件を絞りやすいと思います。
動的に push() されるなどで、配列要素は object が格納されることが保証されているならこんな感じでしょうか。
javascript
1// 追記)空の配列の判定 2// const isEmptyArray = a => Array.isArray(a) && !a.length; 3const aryHasSomething = a => Array.isArray(a) && a.length && a; 4let arr = []; 5let arr2 = [{id: 1, name: 'apple'}]; 6const res4 = (aryHasSomething(arr) || aryHasSomething(arr2))[0] || {}; 7/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~ 8 配列 or falsy が返却される ので、配列添字 0 でアクセス default 9 */ 10console.log(res4)
投稿2020/08/27 07:09
編集2020/08/31 01:56総合スコア5434
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/27 07:20
2020/08/27 07:27
0
やりたいことがよくわかりませんが、丁寧に不具合を入れ込まないように書くと、次のような感じですかね。
空配列と空オブジェクトと、False属性「|」と「||」などを学ばれるとよいと思います。
数値と配列の比較を同列に扱うのは危険というか、普通そんなコード書かないです。
js
1const isUndefined = (value) => { 2 return typeof value === 'undefined'; 3} 4const resFunc = (a, b) => { 5 if (isUndefined(a) && isUndefined(b)) { 6 return 0; 7 } 8 if (!isUndefined(a)) { 9 if (!Array.isArray(a)) { 10 return a; 11 } 12 if (a.length !== 0) { 13 return a; 14 } 15 } 16 if (!isUndefined(b)) { 17 if (!Array.isArray(b)) { 18 return b; 19 } 20 if (b.length !== 0) { 21 return b; 22 } 23 } 24} 25 26let a; 27let b = 1; 28const res = resFunc(a, b) 29console.log(res) 30//=> 1 31 32let c = 2; 33let d; 34const res2 = resFunc(c, d) 35console.log(res2) 36//=> 2 37 38let e; 39let f; 40const res3 = resFunc(e, f) 41console.log(res3) 42//=> 0 43 44// ## ここの判定について 45let arr = []; 46let arr2 = [{id: 1, name: 'apple'}] 47const res4 = resFunc(arr, arr2) 48console.log(res4) 49// [[object Object] { 50// id: 1, 51// name: "apple" 52//}]
投稿2020/08/30 18:01
総合スコア197
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/27 05:36
2020/08/27 05:40