JavaScriptはキー値に基づいて配列内のオブジェクトを見つけて削除します


139

ID = varである配列内のオブジェクトを検索する方法についていくつかのアプローチを試みてきました。見つかった場合は、オブジェクトを配列から削除し、オブジェクトの新しい配列を返します。

データ:

[
    {"id":"88","name":"Lets go testing"},
    {"id":"99","name":"Have fun boys and girls"},
    {"id":"108","name":"You are awesome!"}
]

jQuery $ grepを使用して配列を検索できます。

var id = 88;

var result = $.grep(data, function(e){ 
     return e.id == id; 
});

しかし、id == 88のときにオブジェクト全体を削除して、次のようなデータを返すにはどうすればよいですか。

データ:

[
    {"id":"99","name":"Have fun boys and girls"},
    {"id":"108","name":"You are awesome!"}
]

slice関数と小さなforループの使用についてはどうですか?
アーメドハムディ14

1
確かに、しかし、私がこの質問を書いた理由は、私が行き詰まっているからです;)スニペットはありますか?
トム・


タイトルと質問テキストは矛盾しているようです... 2つのまったく異なるアプローチを提案しています:A.配列からアイテムを削除 するか、B。フィルターされた新しい配列を作成します。
キヤノン

回答:


155

idの配列をgrepできますが、id == 88のオブジェクト全体を削除するにはどうすればよいですか

単に反対の述語でフィルタリングします。

var data = $.grep(data, function(e){ 
     return e.id != id; 
});

12
この回答は、jQueryの最も簡潔で慣用的なソリューションを提供します
Bryan

1
id = somethingのすべてのアイテムを削除する場合は問題ありませんが、$。grepを使用する場合は、配列全体を検索し、長い配列を検索するのは効率的ではないので注意してください。時には、要素が特定のIDで配列内に存在するかどうかを確認する必要があるだけの場合は、別の反復メソッドを使用する方がよい;)
julianox

1
これはそのオブジェクトをリストから削除しません
Arun Sivan '06

1
@ArunSivan sliceも何も削除しません。何をしているのかわからない。ご自身で特定の問題が発生している場合は、新しい質問することができます。
Bergi

1
@Learnerdata.filter(e => !ids.includes(e.id))
Bergi

153

jqueryを使用していない場合の解決策は次のとおりです。

myArray = myArray.filter(function( obj ) {
  return obj.id !== id;
});

2
これfindIndex()splice(index, 1)、親配列で行うよりも優れていますか?
アレックス

spliceは元の配列を変更します。フィルターを使用すると、選択肢があります。
velop

13
これを使用して、1行に減らすことができます。myArr = myArray.filter(obj => obj.id!== id);
DBrown

2
さらに簡潔arr = arr.filter( obj => obj.id !== id);
Omar

86

これは単純化でき、jqueryを使用する必要はありません。

var id = 88;

for(var i = 0; i < data.length; i++) {
    if(data[i].id == id) {
        data.splice(i, 1);
        break;
    }
}

リストを反復処理し、一致するID、スプライスを見つけて、ブレークしてループを終了します


17
+1、ただし、これは一致する最初のアイテムのみを削除することを言及する必要があります。
ベルギ

6
...そして一致した各アイテムを削除する必要がある場合i=data.length; i > 0; i--は、を使用して逆順でループし、使用しないでくださいbreak
Jeremy Belolo、2016

3
i = data.lengthdata[i]何かを壊すでしょう、それは次のようなものでなければなりませんi=data.length -1 ; i > -1; i--
遠く離れた2016年

31

ES6 / 2015では、findIndexおよび配列スプレッド演算子を使用してこれを行う新しいメソッドがあります。

const index = data.findIndex(obj => obj.id === id);
const newData = [
    ...data.slice(0, index),
    ...data.slice(index + 1)
]

これを関数にして、後でこのように再利用できます。

function remove(array, key, value) {
    const index = array.findIndex(obj => obj[key] === value);
    return index >= 0 ? [
        ...array.slice(0, index),
        ...array.slice(index + 1)
    ] : array;
}

このように、1つのメソッドを使用してさまざまなキーで項目を削除できます(条件を満たすオブジェクトがない場合は、元の配列が返されます)。

const newData = remove(data, "id", "88");
const newData2 = remove(data, "name", "You are awesome!");

または、Array.prototypeに配置することもできます。

Array.prototype.remove = function (key, value) {
    const index = this.findIndex(obj => obj[key] === value);
    return index >= 0 ? [
        ...this.slice(0, index),
        ...this.slice(index + 1)
    ] : this;
};

次のように使用します。

const newData = data.remove("id", "88");
const newData2 = data.remove("name", "You are awesome!");

findIndex()は本当に素晴らしいです!👍
danielcraigie

9

idが一意であり、1つの要素を削除するだけで問題が解決すると想定しますsplice

var data = [
  {"id":"88","name":"Lets go testing"},
  {"id":"99","name":"Have fun boys and girls"},
  {"id":"108","name":"You are awesome!"}
],
id = 88;

console.table(data);

$.each(data, function(i, el){
  if (this.id == id){
    data.splice(i, 1);
  }
});

console.table(data);

コールバック関数の要素を後方に持っています。それはあるはずですeach(data,function(idx,ele)。私は後でそれを理解するのに無駄にした30分間分の料金を請求します:)
CSharper

おっとっと。その場合に私ができることは少なくとも、私の回答を更新することです。30分の人生の無駄が本当に気の毒です。
James Hibbard、2015年

5
var items = [
  {"id":"88","name":"Lets go testing"},
  {"id":"99","name":"Have fun boys and girls"},
  {"id":"108","name":"You are awesome!"}
];

jQueryを使用している場合は、次のようにjQuery.grepを使用します。

items = $.grep(items, function(item) { 
  return item.id !== '88';
});
// items => [{ id: "99" }, { id: "108" }]

ES5 Array.prototype.filterを使用:

items = items.filter(function(item) { 
  return item.id !== '88'; 
});
// items => [{ id: "99" }, { id: "108" }]

1
やったー!jQueryマップをフィルターとして使用しないでください。
ベルギ

1
同意します!grepを使用したソリューションは、jQueryを使用した適切なソリューションです。
nekman

4

多分あなたは$.grep()機能を探しています:

arr = [
  {"id":"88","name":"Lets go testing"},
  {"id":"99","name":"Have fun boys and girls"},
  {"id":"108","name":"You are awesome!"}
];

id = 88;
arr = $.grep(arr, function(data, index) {
   return data.id != id
});

3

siftこのような操作やより高度な操作のための強力なコレクションフィルターです。これは、ブラウザーのクライアント側またはnode.jsのサーバー側で機能します。

var collection = [
    {"id":"88","name":"Lets go testing"},
    {"id":"99","name":"Have fun boys and girls"},
    {"id":"108","name":"You are awesome!"}
];
var sifted = sift({id: {$not: 88}}, collection);

それは次のようにフィルタをサポートしています$in$nin$exists$gte$gt$lte$lt$eq$ne$mod$all$and$or$nor$not$size$type、と$regex、と努めはAPI互換のMongoDBのコレクションのフィルタリングとします。


なぜupwotesはないのですか?これが適切に記述されており、ひどいバグがない場合は、非常に役立つはずです。
Max Yari

2
Array.prototype.removeAt = function(id) {
    for (var item in this) {
        if (this[item].id == id) {
            this.splice(item, 1);
            return true;
        }
    }
    return false;
}

これでうまくいくはずです、jsfiddle


0

厳密な等価性をテストする場合は、オブジェクトIDを整数に強制変換してください。

var result = $.grep(data, function(e, i) { 
  return +e.id !== id;
});

デモ


0

アンダースコアjsを使用している場合、キーに基づいてオブジェクトを削除するのは簡単です。 http://underscorejs.org。例:

  var temp1=[{id:1,name:"safeer"},  //temp array
             {id:2,name:"jon"},
             {id:3,name:"James"},
             {id:4,name:"deepak"},
             {id:5,name:"ajmal"}];

  var id = _.pluck(temp1,'id'); //get id array from temp1
  var ids=[2,5,10];             //ids to be removed
  var bool_ids=[];
  _.each(ids,function(val){
     bool_ids[val]=true;
  });
  _.filter(temp1,function(val){
     return !bool_ids[val.id];
  });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.