[Javascript] Rimuovi l'elemento dell'array in base alla proprietà dell'oggetto


Answers

Una possibilità:

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

Si noti che il filter crea una nuova matrice. Qualsiasi altra variabile che fa riferimento all'array originale non otterrebbe i dati filtrati anche se aggiorni la tua variabile originale myArray con il nuovo riferimento. Usare con cautela.

Question

Ho una serie di oggetti come questi:

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

Come posso rimuovere uno specifico in base alla sua proprietà?

Ad esempio, come rimuovere l'oggetto dell'array con "money" come proprietà del campo?




Puoi usare il findIndex di findIndex per ottenere l'indice dell'elemento specifico e poi unirlo usando.

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



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>




Scorrere l'array e splice quelli che non si desidera. Per un utilizzo più semplice, iterare all'indietro in modo da non dover tenere conto della natura live dell'array:

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



Ecco un'altra opzione usando jQuery grep. Passa true come terzo parametro per garantire che grep rimuova gli elementi che corrispondono alla tua funzione.

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

Se stai già utilizzando jQuery, non è richiesto alcuno shim, che potrebbe essere utile piuttosto che usare Array.filter .




La soluzione di jAndy è probabilmente la migliore, ma se non puoi fare affidamento sul filtro puoi fare qualcosa del tipo:

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



Supponi di voler rimuovere il secondo oggetto dalla sua proprietà di campo.

Con ES6 è facile come questo.

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



Di seguito è riportato il codice se non si utilizza jQuery. Demo

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

Puoi anche usare la libreria di sottolineatura che ha molte funzioni.

Underscore è una libreria di utilità per JavaScript che fornisce molto supporto alla programmazione funzionale




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

L'elemento è un oggetto nell'array. Il terzo parametro true significa che restituirà un array di elementi che non funziona nella logica della propria funzione, i false mezzi restituiranno un array di elementi che non funziona nella logica della funzione.