374

次のようなオブジェクトの配列があります。

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

プロパティに基づいて特定のものを削除するにはどうすればよいですか?

たとえば、「money」をフィールド プロパティとして持つ配列オブジェクトを削除するにはどうすればよいでしょうか。

4

12 に答える 12

517

1 つの可能性:

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

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

于 2013-03-08T06:19:37.990 に答える
101

配列を反復処理し、不要spliceなものを除外します。使いやすくするために、逆方向に反復して、配列のライブの性質を考慮する必要がないようにします。

for (var i = myArray.length - 1; i >= 0; --i) {
    if (myArray[i].field == "money") {
        myArray.splice(i,1);
    }
}
于 2013-03-08T06:17:54.493 に答える
22

lodash のfindIndexを使用して特定の要素のインデックスを取得し、それを使用してスプライスできます。

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

アップデート

ES6 のfindIndex()を使用することもできます

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

const itemToRemoveIndex = myArray.findIndex(function(item) {
  return item.field === 'money';
});

// proceed to remove an item only if it exists.
if(itemToRemoveIndex !== -1){
  myArray.splice(itemToRemoveIndex, 1);
}
于 2015-08-20T11:30:20.660 に答える
9

jQuery grep を使用した別のオプションを次に示します。3 番目のパラメーターとして渡しtrueて、grep が関数に一致する項目を確実に削除するようにします。

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

すでに jQuery を使用している場合は、shim は必要ありませんArray.filter

于 2015-03-23T12:20:21.037 に答える
2

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>

于 2018-04-10T09:41:59.020 に答える
1

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);

多くの機能を持つアンダースコア ライブラリを使用することもできます。

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

于 2013-03-08T06:27:29.917 に答える
1

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;
}
于 2013-03-08T06:25:46.120 に答える