配列内のオブジェクトを検索する方法(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!"}
]
私はidの配列をgrepすることができますが、どうすればid == 88のようにオブジェクト全体を削除することができますか
反対の述語で単純にフィルタリングする:
var data = $.grep(data, function(e){
return e.id != id;
});
jqueryを使用していないのであれば、これが解決策です。
myArray = myArray.filter(function( obj ) {
return obj.id !== id;
});
これを簡単にすることができます、そしてここでjqueryを使う必要は本当にありません。
var id = 88;
for(var i = 0; i < data.length; i++) {
if(data[i].id == id) {
data.splice(i, 1);
break;
}
}
リストをたどっていき、一致するIDを見つけて接続し、そして中断してループを終了します。
ES 6/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!");
IDは一意であり、splice
という1つの要素を削除するだけでうまくいきます。
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);
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" }]
多分あなたは$.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
});
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を持つことに努めていますコレクションフィルタリング.
Array.prototype.removeAt = function(id) {
for (var item in this) {
if (this[item].id == id) {
this.splice(item, 1);
return true;
}
}
return false;
}
これでうまくいくはずです。 jsfiddle
厳密な等価性をテストする場合は、必ずオブジェクトIDを整数に変換してください。
var result = $.grep(data, function(e, i) {
return +e.id !== id;
});
アンダースコア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];
});