web-dev-qa-db-ja.com

オブジェクトプロパティに基づいて配列要素を削除する

私はそのようなオブジェクトの配列を持っています:

var myArray = [
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money}
];

特定のものをそのプロパティに基づいて削除する方法

例えばフィールドプロパティとして 'money'を指定して配列オブジェクトを削除する方法を教えてください。

200
imperium2335

一つの可能​​性:

myArray = myArray.filter(function( obj ) {
    return obj.field !== 'money';
});

filterは新しい配列を作成します。元の配列を参照する他の変数は、新しい参照を使用して元の変数myArrayを更新しますが、フィルタ処理されたデータを取得できません。慎重に使用してください。

278
jAndy

配列を繰り返し、 splice 不要なものを取り出します。使いやすくするために、逆方向に反復するので、配列の実際の性質を考慮する必要はありません。

for (var i = myArray.length - 1; i >= 0; --i) {
    if (myArray[i].field == "money") {
        myArray.splice(i,1);
    }
}
75

2番目のオブジェクトをそのfieldプロパティで削除したいとします。

ES6では、これと同じくらい簡単です。

myArray.splice(myArray.findIndex(item => item.field === "cStatus"), 1)
14
Peracek

Lodashの findIndex を使って特定の要素のインデックスを取得し、それを使って接続することができます。

myArray.splice(_.findIndex(myArray, function(item) {
    return item.value === 'money';
}), 1);

更新

ES6の findIndex() を使うこともできます。

FindIndex()メソッドは、提供されたテスト関数を満たす配列内の最初の要素のインデックスを返します。そうでない場合は-1が返されます。

myArray.splice(myArray.findIndex(myArray, function(item) {
    return item.value === 'money';
}), 1);
10
Sridhar

これはjQuery grepを使った別のオプションです。 grepが関数に一致する項目を確実に削除するために、3番目のパラメータとしてtrueを渡します。

users = $.grep(users, function(el, idx) {return el.field == "money"}, true)

すでにjQueryを使用している場合はシムは不要です。これはArray.filterを使用するのとは対照的に便利です。

8
sifriday

以下は、jQueryを使用していない場合のコードです。 デモ

var myArray = [
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: 'money'}
];

alert(myArray.length);

for(var i=0 ; i<myArray.length; i++)
{
    if(myArray[i].value=='money')
        myArray.splice(i);
}

alert(myArray.length);

たくさんの機能を持つアンダースコアライブラリを使うこともできます。

nderscore は多くの関数型プログラミングサポートを提供する、JavaScript用のユーティリティベルトライブラリです。

4
Umair Saleem
var myArray = [
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money}
];
console.log(myArray.length); //3
myArray = $.grep(myArray, function(element, index){return element.field == "money"}, true);
console.log(myArray.length); //2

要素は配列内のオブジェクトです。 3番目のパラメータtrue meansは関数ロジックに不合格の要素の配列を返し、false手段は関数ロジックに不合格の要素の配列を返します。

3
Sandeep sandy

lodash ライブラリを使う:

var myArray = [
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: 'money'}
];
var newArray = _.remove(myArray, function(n) {
  return n.value === 'money';;
});
console.log('Array');
console.log(myArray);
console.log('New Array');
console.log(newArray);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>
2
Parth Raval

上記のコメントに基づいて、キー名とキー値に基づいてオブジェクトを削除する方法を説明します。

 var items = [ 
  { "id": 3.1, "name": "test 3.1"}, 
  { "id": 22, "name": "test 3.1" }, 
  { "id": 23, "name": "changed test 23" } 
  ]

    function removeByKey(array, params){
      array.some(function(item, index) {
        return (array[index][params.key] === params.value) ? !!(array.splice(index, 1)) : false;
      });
      return array;
    }

    var removed = removeByKey(items, {
      key: 'id',
      value: 23
    });

    console.log(removed);
1
JackTheKnife

jAndyの解決策はおそらく最善ですが、あなたがフィルタに頼ることができない場合は、次のようにすることができます。

var myArray = [
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: "money"}
];

myArray.remove_key = function(key){
    var i = 0, 
        keyval = null;
    for( ; i < this.length; i++){
        if(this[i].field == key){
            keyval = this.splice(i, 1);
            break;
        }
    }
    return keyval;
}
1
Rob M.