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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

5回答

693閲覧

javascript: 配列の空の判定

nanase21

総合スコア144

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/08/27 05:24

実現したいこと

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ページで確認できます。

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

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

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

guest

回答5

0

そもそも論として、|演算は数値用です(MDN)。

そして、[]はtruthyなので、「lengthが0かどうか」をチェックするなど、相応の手間をかけるより他に方法はありません。

投稿2020/08/27 05:27

maisumakun

総合スコア146018

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

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

nanase21

2020/08/27 05:36

let arr = []; let arr2 = [{id: 1, name: 'apple'}] let res4; if(arr.length){ res4 = arr; }else if(arr2.length){ res4 = arr2; } console.log(res4) となるとこのような方法しかないのでしょうか?
maisumakun

2020/08/27 05:40

そうですね、そんな感じです。
guest

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
miyabi_takatsuk

総合スコア9555

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

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

nanase21

2020/08/27 05:44

この場合って、arrの長さしかみていないですよね? 今、求めている答えとしてはarrに中身があればarrを代入し、arrが空であればほぼほぼある想定のarr2が代入されるのでこれでも問題なさそうですね。
miyabi_takatsuk

2020/08/27 05:54

質問要件に書いてないので、しっかり要件定義してください。
maisumakun

2020/08/27 05:59

> この場合って、arrの長さしかみていないですよね? lengthの値をいじった変なオブジェクトを与えることがありうるのであれば、それを考慮したコードとする必要はもちろんあります。
nanase21

2020/08/27 06:13

@miyabi_takatsukさん 申し訳ございませんでした。 確認のために追加でご質問させていただいた次第でございます。 ご不快にさせるつもりはありませんでした。 @maisumakun ご教示いただきありがとうございました。
miyabi_takatsuk

2020/08/27 06:14

変数が配列かどうかも比較条件にいれました。 もし、変数が未定義でも、エラーなく比較演算を行える構文です。
nanase21

2020/08/27 06:17

ありがとございます。 私の要件漏れによりお手数をおかけしてしまい申し訳ございませんでした。 ご教示いただきありがとうございました。
guest

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
AkitoshiManabe

総合スコア5434

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

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

miyabi_takatsuk

2020/08/27 07:20

isArrayの存在をすっかり忘れてました・・・。
AkitoshiManabe

2020/08/27 07:27

コードを読む力になりますので古典を示しても良いと思っています。 むしろ、回答者全員が演算子に言及した点こそ重要。
guest

0

javascript

1const res4 = (arr==0?0:arr) || (arr2==0?0:arr2) || {};

投稿2020/08/27 05:46

yambejp

総合スコア116724

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

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

yambejp

2020/08/27 05:47

おすすめはしせんが、あえて姑息になるならの例です
nanase21

2020/08/27 06:13

ご教示いただきありがとうございます。 このような書き方もあるのですね。 勉強になりました。
guest

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//}]

https://jsbin.com/yohinapasu/edit?html,js,console

投稿2020/08/30 18:01

standard-soft

総合スコア197

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問