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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

Q&A

解決済

6回答

1592閲覧

JavaScriptで、インデックス番号を保持しつつ、配列からキーを削除するにはどうすればいいですか

qwe001

総合スコア133

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

0グッド

0クリップ

投稿2020/01/15 02:42

配列から指定したインデックス番号のキーを削除しつつ、インデックス番号の並びは詰めない(歯抜けさせる)、といったことがしたいです。

PHPで書けば、このような内容です

php

1function adjustArray($array, $index) 2{ 3 $newArray = array(); 4 foreach($array as $key => $value){ 5 if($key != $index){ 6 $newArray[$key] = $value; 7 } 8 } 9 10 return $newArray; 11} 12 13$array = [0,0,0,0,0]; 14 15$array = adjustArray($array, 1); 16 17var_dump($array); 18 19array(4) { 20 [0]=> 21 int(0) 22 [2]=> 23 int(0) 24 [3]=> 25 int(0) 26 [4]=> 27 int(0) 28} 29 30$array = adjustArray($array, 2); 31 32var_dump($array); 33 34array(3) { 35 [0]=> 36 int(0) 37 [3]=> 38 int(0) 39 [4]=> 40 int(0) 41} 42 43$array = adjustArray($array, 3); 44 45array(2) { 46 [0]=> 47 int(0) 48 [4]=> 49 int(0) 50}

これと同等の動きを、JavaScriptで実現したいです。

JavaScriptの配列では実現が難しいでしょうか?

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

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

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

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

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

maisumakun

2020/01/15 02:45

どういった目的でそのようなことがしたいのでしょうか。
Zuishin

2020/01/15 03:12

配列ではできないけどオブジェクトまたは Map ならできます。目的によっては他の方法がふさわしいかもしれません。削除の代わりに undefined などを代入して削除マークとみなす方法もあります。
guest

回答6

0

いちおう、deleteを使って無理やり歯抜け配列を作ることはできます…が、そのような配列はJavaScriptでは一般的ではありませんし、扱いづらいです。

javascript

1const foo = [1, 2, 3]; 2delete foo[1]; 3console.log(foo[1]); // 存在しないけれど「undefined」となってしまう 4console.log(foo.length); // 歯抜けとは関係なく「3」になる

投稿2020/01/15 03:24

編集2020/01/15 03:26
maisumakun

総合スコア145183

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

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

qwe001

2020/01/15 03:40

ご回答ありがとうございます。deleteは私も試しましたが、これですとご指摘の通り配列のlengthの値が変わりません。やりたいことは、配列から指定したキーを抜きつつ、残ったキーの数を数えてfor文のループを回すことです。Objectを使って実現可能でしょうか…?
maisumakun

2020/01/15 03:52

.forEachは、deleteしたキーを飛ばして回っていきます。 > deleteは私も試しましたが なら、その旨を質問時点で書いてほしかったです。
退会済みユーザー

退会済みユーザー

2020/01/15 23:34

undefind は未定義値 null は宣言されてるけど空 でdeleteは未定義にする
guest

0

ベストアンサー

やりたいことは、配列から指定したキーを抜きつつ、残ったキーの数を数えてfor文のループを回すことです。Objectを使って実現可能でしょうか…?

ES6の範囲に限った方がよさそうですが、配列で概ね実現可能です。

js

1a=[0,0,0,0,0] 2console.log(Object.keys(a).length, a.length); 3//5 5 4 5delete a[1]; // 配列から指定したキーを抜きつつ、 6console.log(Object.keys(a).length, a.length); // 残ったキーの数を数えて 7//4 5 8 9for ( var x in a ) console.log(x); // for文のループを回す 10//0 11//2 12//3 13//4

 
ただし、取扱注意です。
以下を読んで、きちんと理解してから使うことをお勧めします。たぶん、バグの温床になります。
ES6 以降は JavaScript のプロパティに順序は「ある」 - Qiita
[JavaScript] 疎な配列(Sparse Arrays) - Qiita

投稿2020/01/15 05:19

Lhankor_Mhy

総合スコア36074

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

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

qwe001

2020/01/17 09:09

ご回答ありがとうございます。こちらのやり方でやりたいことができました
guest

0

インデックス番号を別途管理する必要がありますが、Mapが近いといえば近いです。

【Map - JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map

投稿2020/01/15 03:15

kei344

総合スコア69400

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

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

0

スプレッド構文(…ってやつ)で配列からオブジェクトに変えれば良いのでは?
ただ、length取るにはひと手間かかります。

js

1const foo = [1, 2, 3]; 2const fooObj = { ...foo }; 3 4console.log(fooObj); // { 0: 1, 1: 2, 2: 3 } 5 6delete fooObj[1] 7 8console.log(fooObj[1]); //undefind 9 10console.log(fooObj); // { 0: 1, 2: 3 } 11console.log(fooObj.length);//undefind 12console.log(Object.keys(fooObj).length); //2 13

投稿2020/01/15 20:26

oikashinoa

総合スコア2826

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

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

0

PHPはゆうなればすべての配列が連想配列なので歯抜けができます
javascriptの配列はキーが0から始まる連番なので配列としては
歯抜けにすることはできません

投稿2020/01/15 03:06

yambejp

総合スコア114775

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

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

yambejp

2020/01/15 03:06

どうしてもやりたければオブジェクトで処理することです ただしオブジェクトはイテラブルではないので順序が保証されません
guest

0

擬似的に・・・

javascript

1function adjustArray(array, index) 2{ 3 const newArray = [...array] 4 delete newArray[index] 5 return newArray 6} 7 8function var_dump(array) 9{ 10 console.log(`array(${array.filter(v => v !== undefined).length}) {`) 11 array.forEach((v, i) => v !== undefined && console.log(` [${i}]=>\n ${v}`)) 12 console.log('}') 13} 14 15let array = [0,0,0,0,0] 16 17array = adjustArray(array, 1) 18 19var_dump(array) 20 21array = adjustArray(array, 2) 22 23var_dump(array) 24 25array = adjustArray(array, 3) 26 27var_dump(array)

投稿2020/01/15 03:24

編集2020/01/15 03:31
shiracamus

総合スコア5406

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問