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

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

ただいまの
回答率

90.49%

  • JavaScript

    16934questions

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

objectから特定要素を削除したいときの簡潔な記述方法は?

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 5,512

DaisukeSakai

score 42

前提・実現したいこと

オブジェクトから特定要素、例えばあるプロパティの値が指定した値と一致する場合、その要素をオブジェクトから完全に削除するもっともスマートな記述方法。

該当のソースコード

//オブジェクト
var object = [{a: 1}, {a: 2}, {a: 3}];

//ある条件、例えばa === 2 と合致する2番目の要素を完全に削除したい。結果としては以下のように、null値やundefinedは含まないように
object = [{a: 1}, {a: 3}];

試したこと

Array.prototype.forEach.call(object, (e, i, s) => {
   if(e.a === 2) {
      //ここで色々試してみた...
   }
});

delete e[i]; ⇒ null、undefinedになってしまう。

s.splice(i, 1); ⇒ エラーも出ないが、オブジェクト自体も変化せず。

これはうまくいく...
var object = (function() {
   var _object = [];
   Array.prototype.forEach.call(object, (e, i, s) => {
      if(e.name !== 2) {
         _object.push(e);
      }
   })
   return _object;
})();

でも何かすっきりしない。新しい要素を作成せずに単純に切り離すようなことはできないのでしょうか。どんなコードでも参考にしてみたいので、お返事をくださいー!

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

array.filter はどうでしょう。

var object = [{a: 1}, {a: 2}, {a: 3}]; 
var filteredArray = object.filter( function( element, index, array ){ return ( element.a && element.a === 2 );} );
console.log( filteredArray );


【Array.prototype.filter() - JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/08 15:14

    返信ありがとうございます。なるほど、Array.prototype.filterですか。だいぶすっきり書けますね。参考になります。結構、こういう処理って使う場面が多いと思うのですが、みなさんどうやっているのですか。どんどん聞きたいです。

    キャンセル

0

spliceは?

var a = [1,2,3,4,5];
a.splice(2,1); // index=2から1要素削除
console.log(a); // [1,2,4,5]

ループで回すとindexがずれたりして動きがおかしくなるので注意が必要。
たとえば配列中の「2」を削除する場合:

for(var i =0; i< a.length; ){
  if(a[i] === 2){ a.splice(i,1); continue; }
  i++;
}


とか

for(var i =0; i< a.length; i++){
  if(a[i] === 2){ a.splice(i--,1); continue; }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/08 15:11 編集

    返信ありがとうございます。
    すいません。質問の記述が間違っていました。spliceも試してみたのですが、質問のようなオブジェクトを含む配列の場合、spliceでは削除できなかったのです。私の記述ミスかもしれませんが...特にエラーもなく、けどオブジェクト自体は変化もせずといった...それでこの質問に至った次第なのです。試したコードを質問に追記しておきます。

    キャンセル

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    連想配列の値からキーを取得する方法はありませんか?

    // 連想配列 var obj = {   a1: 'asd',   a2: 'sdf',   a3: 'dfg',   a4: 'fgh' }; // 連想配列で検索する値 v

  • 解決済

    prototypeに関数を定義する価値は?

    メインがPHPで最近javascriptを勉強し始めた者です。 私の理解がそもそも違うということであれば、 指摘頂けるととても嬉しいです! prototypeに関数を定義する価値

  • 受付中

    プロトタイプからメソッドを拾う場合の手法

    JavaScriptを書いていると、以下のような場面で、標準オブジェクトのプロトタイプからメソッドを引っ張ってくる必要が生じます。 「配列のようなオブジェクト」にArrayのメソ

  • 受付中

    Functionクラスについて

    var obj1 = new Function("return 1;"); console.log(obj1 instanceof Function);前回の質問でこのようなコー

  • 受付中

    forEachの使い方

    forEachの使い方がイマイチ理解できないで困っています 例とクラス名の追加をする場合、下記コードは適切な書き方なのでしょうか? function addClass(elem

  • 解決済

    何故callメソッドがあってundefinedではないのか

    javascriptのbindメソッドは、第一引数にレシーバオブジェクトのthis参照を指定でき、第二引数以降にそのレーシバオブジェクトに渡す引数を指定できるものと認識しております

  • 解決済

    fn.apply(ctx, array)とFunction.prototype.apply.call...

    前提・実現したいこと fn.apply(ctx, [1, 2, 3]) //と Function.prototype.apply.call(fn, ctx, [1, 2, 3])

  • 解決済

    apply()やcall()を使う機会を知りたい

    apply()、call()メソッドについて この2つのメソッドについては、使用している実際のコードを目にすることもあり、これまでにもネットで調べて自分でカスタマイズしつつ検証し

同じタグがついた質問を見る

  • JavaScript

    16934questions

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