質問するログイン新規登録
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

解決済

3回答

3217閲覧

Javascriptのオブジェクト配列に対して.delete()を適用したい!

Tanaka2319

総合スコア19

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

0クリップ

投稿2019/05/23 07:03

0

0

Javascriptについて分からないことがあります!

下記のリンクにもあるように、
オブジェクト配列に対して、.delete(●、○)を記述すれば、オブジェクト●:値○を有した連想配列が削除されると思われます。

https://qiita.com/snst-lab/items/e5b86fe5fb74903180c7

しかしながら、仮にdelete()内の値渡しを書かない場合、全ての連想配列が削除されると言うことは生じるのでしょうか?

もし生じないのであれば、
連想配列を一括で削除する方法はないものでしょうか?
よろしくお願いします。

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

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

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

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

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

yambejp

2019/05/23 07:08

もっと具体的にかいてください ・どういうオブジェクトに ・どういうオブジェクトが格納されていて ・どう指定したら ・どういう結果にしたいのでしょうか?
miyabi-sun

2019/05/23 07:16

そもそも連想配列ってなんですか? JavaScriptには連想配列なるものはありません。 > 次のようなオブジェクトの配列(連想配列の配列)があるとした場合、 Qiitaはアカウントさえ作れば誰でも記事が書けますので、こういった専門知識外の詳しくない人でも簡単に記事を作れます。 結果誤った情報だらけになっており、例えばこの記事はやってる事が難解な割にあまり役に立つ内容でもないです。 恐らく別言語畑のエンジニアなのでしょう。 こういう記事でまともな記事はよく埋もれているのでお気をつけてください。
maisumakun

2019/05/23 07:19

破壊的に済ませたい強い理由があるのでもなければ、Array.prototype.filterで書いたほうがわかりやすいですよね>当該記事
kei344

2019/05/23 07:22

過去の質問について、「解決済」になっていないものが多数見受けられます。解決したものは「ベストアンサー」を選び、自力で解決した場合はその方法を解答欄に書き、もし万が一解決していないのであれば質問を編集するなどしてみてください。
guest

回答3

0

下記のリンクにもあるように、

これはこの記事を書いた人が勝手に作った関数です。JavaScript標準には存在しません。

しかしながら、仮にdelete()内の値渡しを書かない場合、全ての連想配列が削除されると言うことは生じるのでしょうか?

何も渡さなかった場合、e[keyProp]===keyVale[undefined]===undefined、すなわちe.undefined === undefinedと解釈されますので、undefinedというキーのないオブジェクトであれば削除対象となります。

連想配列を一括で削除する方法はないものでしょうか?

arr.length = 0;とするのが手っ取り早いかと思います。

投稿2019/05/23 07:15

maisumakun

総合スコア146768

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

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

0

ベストアンサー

削除方針

削除方針が不明ですが、「破壊的に特定の要素を削除する方針」と仮定します。

※配列でこの状況なら、Array.prototype.filter を使う人が多いと思われますが、破壊的動作が必ずしも非推奨とは思いません。
データの持ち方次第では、配列やオブジェクトの値を直接か聞かるべき状況もあります。
ただ、とりあげられた記事のコードでいうなら、new Map 向きのオブジェクトだと思いました(後述参照)。

Array.prototype.splice

Array.prototype.splice で任意の要素を破壊的に削除できます。

JavaScript

1var commodity = [ 2 {"name":"apple","price":300}, 3 {"name":"orange","price":200}, 4 {"name":"banana","price":250} 5]; 6 7commodity.splice(1, 1); // index=1の要素を削除する 8console.log(JSON.stringify(commodity)); // [{"name":"apple","price":300},{"name":"banana","price":250}]

delete 演算子

delete 演算子でも任意の要素を削除可能ですが、Array.prototype.splice と異なり、他要素のindex値に影響を与えません。

JavaScript

1var commodity = [ 2 {"name":"apple","price":300}, 3 {"name":"orange","price":200}, 4 {"name":"banana","price":250} 5]; 6 7delete commodity[1]; // index=1の要素を削除する 8console.log(ommodity); // [{"name":"apple","price":300},,{"name":"banana","price":250}]

この挙動は配列の走査手段に影響しますので、「spliteと比較して、どちらが要件に適うのか」を吟味する必要があります。

new Map

https://qiita.com/snst-lab/items/e5b86fe5fb74903180c7

こちらのコード事例なら、new Map を使うと、よりエレガントに書けます。

JavaScript

1const fruitsMap = new Map([['apple', 300], ['orange', 200], ['banana', 250]]); 2 3console.log(JSON.stringify([...fruitsMap])); // [["apple",300],["orange",200],["banana",250]] 4fruitsMap.set('apple', 400); 5console.log(fruitsMap.get('apple')); // 400 6console.log(JSON.stringify([...fruitsMap])); // [["apple",400],["orange",200],["banana",250]] 7console.log(fruitsMap.size); // 3 8 9fruitsMap.delete('orange'); 10console.log(fruitsMap.has('orange')); // false 11console.log(fruitsMap.size); // 2 12console.log(JSON.stringify([...fruitsMap])); // [["apple",400],["banana",250]] 13 14fruitsMap.clear(); 15console.log(JSON.stringify([...fruitsMap])); // [] 16console.log(fruitsMap.size); // 0

更新履歴

  • 2019-05-23 21:57:43 「削除方針」で Array.prototype.filter に言及

Re: Tanaka2319 さん

投稿2019/05/23 12:50

編集2019/05/23 12:59
think49

総合スコア18194

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

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

Tanaka2319

2019/05/23 16:10

ご丁寧にありがとうございます! 助かりました!
think49

2019/05/23 23:36

質問の意図を明確にし、解決方法を書くようお願いします。 この質問は同様の問題に遭遇した人の参考情報になります。
guest

0

こんな感じで

javascript

1Array.prototype.del=function(key,val){ 2 var obj=this; 3 obj.map(function(x,y){ 4 return x[key]===val?y:null; 5 }).filter(function(x){ 6 return x!==null; 7 }).sort(function(x,y){ 8 return y-x; 9 }).forEach(function(x){ 10 obj.splice(x,1); 11 }); 12} 13var commodity = [ 14 {"name":"apple","price":300}, 15 {"name":"apple","price":200}, 16 {"name":"apple","price":210}, 17 {"name":"orange","price":200}, 18 {"name":"orange","price":100}, 19 {"name":"banana","price":200}, 20 {"name":"banana","price":150}, 21]; 22commodity.del("price",200); 23console.log(JSON.stringify(commodity)); 24commodity.del("name","apple"); 25console.log(JSON.stringify(commodity));

投稿2019/05/23 07:37

yambejp

総合スコア118098

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

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

Tanaka2319

2019/05/23 16:08

助かりました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問