Eliminar objeto de matriz usando JavaScript


549

¿Cómo puedo eliminar un objeto de una matriz? Deseo eliminar el objeto que incluye el nombre Kristiande someArray. Por ejemplo:

someArray = [{name:"Kristian", lines:"2,5,10"},
             {name:"John", lines:"1,19,26,96"}];

Quiero lograr:

someArray = [{name:"John", lines:"1,19,26,96"}];


3
Para su información, he revertido la edición de esta pregunta para que la sintaxis de la matriz vuelva a ser incorrecta y todas estas respuestas estén en contexto.
Dunhamzzz

2
Y luego la sintaxis de la matriz se "corrigió" (dos veces) nuevamente, de modo que las respuestas ya no están en contexto.
Teepeemm

44
¿Cómo ayuda el error de sintaxis a que algunas respuestas tengan sentido?
Samy Bencherif

1
@SamyBencherif: algunas de las respuestas abordan explícitamente el error de sintaxis en la versión original de la pregunta, por lo que si elimina ese error de sintaxis, esas respuestas ahora están hablando de algo que no existe.
nnnnnn

Respuestas:


778

Puede usar varios métodos para eliminar elementos de una matriz:

//1
someArray.shift(); // first element removed
//2
someArray = someArray.slice(1); // first element removed
//3
someArray.splice(0, 1); // first element removed
//4
someArray.pop(); // last element removed
//5
someArray = someArray.slice(0, a.length - 1); // last element removed
//6
someArray.length = someArray.length - 1; // last element removed

Si desea eliminar el elemento en la posición x, use:

someArray.splice(x, 1);

O

someArray = someArray.slice(0, x).concat(someArray.slice(-x));

Responda al comentario de @ chill182 : puede eliminar uno o más elementos de una matriz utilizando Array.filtero Array.splicecombinados con Array.findIndex(consulte MDN ), por ejemplo

// non destructive filter > noJohn = John removed, but someArray will not change
let someArray = getArray();
let noJohn = someArray.filter( el => el.name !== "John" ); 
log("non destructive filter > noJohn = ", format(noJohn));
log(`**someArray.length ${someArray.length}`);

// destructive filter/reassign John removed > someArray2 =
let someArray2 = getArray();
someArray2 = someArray2.filter( el => el.name !== "John" );
log("", "destructive filter/reassign John removed > someArray2 =", 
  format(someArray2));
log(`**someArray2.length ${someArray2.length}`);

// destructive splice /w findIndex Brian remains > someArray3 =
let someArray3 = getArray();
someArray3.splice(someArray3.findIndex(v => v.name === "Kristian"), 1);
someArray3.splice(someArray3.findIndex(v => v.name === "John"), 1);
log("", "destructive splice /w findIndex Brian remains > someArray3 =", 
  format(someArray3));
log(`**someArray3.length ${someArray3.length}`);

// Note: if you're not sure about the contents of your array, 
// you should check the results of findIndex first
let someArray4 = getArray();
const indx = someArray4.findIndex(v => v.name === "Michael");
someArray4.splice(indx, indx >= 0 ? 1 : 0);
log("", "check findIndex result first > someArray4 (nothing is removed) > ",
  format(someArray4));
log(`**someArray4.length (should still be 3) ${someArray4.length}`);

function format(obj) {
  return JSON.stringify(obj, null, " ");
}

function log(...txt) {
  document.querySelector("pre").textContent += `${txt.join("\n")}\n`
}

function getArray() {
  return [ {name: "Kristian", lines: "2,5,10"},
           {name: "John", lines: "1,19,26,96"},
           {name: "Brian", lines: "3,9,62,36"} ];
}
<pre>
**Results**

</pre>


2
@Klemzy, ¿no quiso decir con índice? por valor ...?
Royi Namir

328
La pregunta original preguntaba cómo eliminar el objeto con el nombre = "Kristian" de la matriz. Su respuesta supone que es el primer elemento de la matriz, pero ¿qué pasa si Kristin no está en el primer elemento? Entonces tu respuesta no funciona.
Rochelle C

77
@ chill182: no es una respuesta específica, sino más general. A partir de él, debería poder inferir el método para eliminar elementos. Si desea eliminar el elemento en la posición x ... puede ser una pista para eliminar otros elementos que no sean los primeros, ¿verdad?
KooiInc

66
La función de empalme fue útil para mí, pero no debería haber reasignado someArray. Esto dará como resultado una matriz que contiene el elemento eliminado, en lugar de que contenga la matriz resultante con el elemento eliminado.
Kenn Cal

1
Debe verificar el findIndexresultado antes de usarlo splice. Si no hay elementos en la matriz que coincidan, la condición findIndexvolverá -1y colocar esto directamente splicedará como resultado una eliminación arbitraria del último elemento en la matriz.
jdnz

131

Recomiendo usar lodash.js o sugar.js para tareas comunes como esta:

// lodash.js
someArray = _.reject(someArray, function(el) { return el.Name === "Kristian"; });

// sugar.js
someArray.remove(function(el) { return el.Name === "Kristian"; });

En la mayoría de los proyectos, es bastante útil tener un conjunto de métodos auxiliares proporcionados por bibliotecas como estas.


13
Creo que el ejemplo de subrayado está ligeramente apagado. Debería sersomeArray = _.reject(someArray, function(el) { return el.Name === "Kristian"; });
Andy Ford

77
Si no desea utilizar underscore.js o sugar.js, puede hacerlosomeArray = someArray.filter(function(e) { return e.Name !== "Kristian"; });
BenR

1
Otra cosa que quiero, habrá botones separados para cada objeto en la matriz. si quiero eliminar ese objeto en particular en el botón de matriz, haga clic. cómo hacerlo . He usado angular js ng-repeat para generar elementos. ¿me pueden ayudar
Thilak Raj

55
Voy a ir contra la corriente aquí; sugiriendo que se incluya una biblioteca completa con el simple propósito de eliminar elementos de los objetos (que js soporta limpiamente desde el primer momento, como lo muestra la respuesta aceptada) es deficiente. Agrega peso y complejidad innecesarios a su código a menos que ya lo necesite para la funcionalidad más poderosa que proporciona la biblioteca.
Josh Doebbert el

44
Para una operación simple, nunca recomendaré incluir la biblioteca
Munna Bhakta

130

La solución limpia sería usar Array.filter:

var filtered = someArray.filter(function(el) { return el.Name != "Kristian"; }); 

El problema con esto es que no funciona en IE <9. Sin embargo, puede incluir código de una biblioteca de Javascript (por ejemplo, subrayado.js ) que implementa esto para cualquier navegador.


10
Sin embargo, esto eliminará todos los sucesos encontrados, no solo el primero
Flavien Volken

44
Y devolverá una nueva matriz en lugar de modificar la original. Dependiendo del caso de uso, esto puede o no ser lo que desea.
Jochie Nabuurs

1
@JochieNabuurs es, de hecho, una nueva matriz. Sin embargo, el objeto sigue siendo el mismo. Todavía puede modificar el valor de cada objeto y se reflejará en el objeto de la matriz original.
DriLLFreAK100

2
Hasta el punto de que esto devuelve una nueva matriz, simplemente cambiando la solución a someArray = someArray.filter(function(el) { return el.Name != "Kristian"; }); direcciones que, ¿no?
hBrent

93

¿Qué tal esto?

$.each(someArray, function(i){
    if(someArray[i].name === 'Kristian') {
        someArray.splice(i,1);
        return false;
    }
});

8
No provocará un error porque $.each()almacena en caché la longitud de la matriz antes de hacer un bucle, por lo que si elimina un elemento $.each()se ejecutará más allá del final de la matriz (ahora más corta). (Entonces someArray[i]será undefinedy undefined.namese estrellará).
nnnnnn

55
Luego agregue un 'retorno falso' después del empalme.
Allan Taylor

18
Esto no es JavaScript. -1
onionpsy

20
Tenga en cuenta que esta respuesta requiere jQuery
Clarkey

68

Su "matriz" como se muestra es una sintaxis JavaScript no válida. Los corchetes {}son para objetos con pares de nombre / valor de propiedad, pero los corchetes []son para matrices, así:

someArray = [{name:"Kristian", lines:"2,5,10"}, {name:"John", lines:"1,19,26,96"}];

En ese caso, puede usar el .splice()método para eliminar un elemento. Para eliminar el primer elemento (índice 0), diga:

someArray.splice(0,1);

// someArray = [{name:"John", lines:"1,19,26,96"}];

Si no conoce el índice pero desea buscar en la matriz para encontrar el elemento con el nombre "Kristian" para eliminarlo, puede hacerlo:

for (var i =0; i < someArray.length; i++)
   if (someArray[i].name === "Kristian") {
      someArray.splice(i,1);
      break;
   }

EDITAR: Acabo de notar que su pregunta está etiquetada con "jQuery", por lo que puede probar el $.grep()método :

someArray = $.grep(someArray,
                   function(o,i) { return o.name === "Kristian"; },
                   true);

¿Por qué agregaron la sobrecarga? Seguramente podría haber puesto! = "Kristian". ¿Para qué sirve la sobrecarga?
markthewizard1234

@ markthewizard1234 - ¿Te refieres al argumento booleano "invertido" $.grep()? No agrega mucho en este ejemplo, donde sí, podría haberlo puesto !=, pero en otros casos es posible que ya tenga una función definida que haga la prueba opuesta a lo que desea grep, así que en lugar de definir un función adicional, puede usar esa sobrecarga para invertir los resultados.
nnnnnn

Ah, así que si tuviera una función de contenedor que contenga grep, podría establecer el booleano como parámetro. ¡Gracias!
markthewizard1234

@ markthewizard1234 - Podrías, pero eso no es lo que tenía en mente: imagina que lo hiciste function isEven(num) { return num%2===0 }. Puede usar $.grep(someArray, isEven)para obtener solo los números pares de la matriz, o $.grep(someArray, isEven, true)hacer lo contrario y obtener los valores no pares.
nnnnnn

63

ES2015

let someArray = [
               {name:"Kristian", lines:"2,5,10"},
               {name:"John", lines:"1,19,26,96"},
               {name:"Kristian", lines:"2,58,160"},
               {name:"Felix", lines:"1,19,26,96"}
            ];

someArray = someArray.filter(person => person.name != 'John');

¡Eliminará a John !


44
Hombre ... Viniendo de Java, estoy muy confundido de que una cosa tan básica que hacer requiere el filtrado de una lista ... wtf. Esta es la respuesta más precisa a la pregunta de OP que leí hasta ahora.
codepleb

Sí, este es un buen enfoque. Aunque también funcionará antes de ES2015 (ES6). La función de filtro ha estado disponible desde la versión 5.1 (2011) ecma-international.org/ecma-262/5.1/#sec-15.4.4.20
usuario3777549

40

Podrías usar array.filter ().

p.ej

        someArray = [{name:"Kristian", lines:"2,5,10"},
                     {name:"John", lines:"1,19,26,96"}];

        someArray = someArray.filter(function(returnableObjects){
               return returnableObjects.name !== 'Kristian';
        });

        //someArray will now be = [{name:"John", lines:"1,19,26,96"}];

Funciones de flecha:

someArray = someArray.filter(x => x.name !== 'Kristian')

Otra cosa que quiero, habrá botones separados para cada objeto en la matriz. si quiero eliminar ese objeto en particular en el botón de matriz, haga clic. cómo hacerlo . He usado angular js ng-repeat para generar elementos. ¿me pueden ayudar
Thilak Raj

daCoda ¿y si tienes dos condiciones?
Malcolm Salvador

@MalcolmSalvador, por ejemplo, si tiene otras condiciones, puede escribir esto como a continuación y continuar con diferentes && o || operador de acuerdo a su necesidad. someArray = someArray.filter (function (rebunableObjects) {return returnnableObjects.name! == 'Kristian' && cond2Query.age> = 22;});
Biswajit Panday

18

He realizado una función dinámica que toma los objetos Matriz, Clave y valor y devuelve la misma matriz después de eliminar el objeto deseado:

function removeFunction (myObjects,prop,valu)
        {
             return myObjects.filter(function (val) {
              return val[prop] !== valu;
          });

        }

Ejemplo completo: DEMO

var obj = {
            "results": [
              {
                  "id": "460",
                  "name": "Widget 1",
                  "loc": "Shed"
              }, {
                  "id": "461",
                  "name": "Widget 2",
                  "loc": "Kitchen"
              }, {
                  "id": "462",
                  "name": "Widget 3",
                  "loc": "bath"
              }
            ]
            };


        function removeFunction (myObjects,prop,valu)
        {
             return myObjects.filter(function (val) {
              return val[prop] !== valu;
          });

        }


console.log(removeFunction(obj.results,"id","460"));

15

Esta es una función que me funciona:

function removeFromArray(array, value) {
    var idx = array.indexOf(value);
    if (idx !== -1) {
        array.splice(idx, 1);
    }
    return array;
}

Otra cosa que quiero, habrá botones separados para cada objeto en la matriz. si quiero eliminar ese objeto en particular en el botón de matriz, haga clic. cómo hacerlo . He usado angular js ng-repeat para generar elementos. ¿me pueden ayudar
Thilak Raj

12

También podrías intentar hacer algo como esto:

var myArray = [{'name': 'test'}, {'name':'test2'}];
var myObject = {'name': 'test'};
myArray.splice(myArray.indexOf(myObject),1);

11
someArray = jQuery.grep(someArray , function (value) {
        return value.name != 'Kristian';
});

10

Utilice la función de empalme en matrices. Especifique la posición del elemento de inicio y la longitud de la subsecuencia que desea eliminar.

someArray.splice(pos, 1);

8

Vote por UndercoreJS para un trabajo simple con matrices.

La función _.without () ayuda a eliminar un elemento:

 _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
    => [2, 3, 4]

La mejor solucion. Funciona con matrices de objetos.
Azee

4

Con función de flecha ES 6

let someArray = [
                 {name:"Kristian", lines:"2,5,10"},
                 {name:"John", lines:"1,19,26,96"}
                ];
let arrayToRemove={name:"Kristian", lines:"2,5,10"};
someArray=someArray.filter((e)=>e.name !=arrayToRemove.name && e.lines!= arrayToRemove.lines)

3

La solución más simple sería crear un mapa que almacene los índices para cada objeto por nombre, de esta manera:

//adding to array
var newPerson = {name:"Kristian", lines:"2,5,10"}
someMap[ newPerson.name ] = someArray.length;
someArray.push( newPerson );

//deleting from the array
var index = someMap[ 'Kristian' ];
someArray.splice( index, 1 );

Me gusta esta idea, pero también debo preguntar, ¿cuáles son los límites de uso de memoria para una idea como esta a medida que se agregan índices? Tengo una matriz que me gustaría indexar en 2 campos diferentes en el objeto, por lo que tendría 2 mapas además de la matriz fuente original. ¿Es este un pequeño precio a pagar por la velocidad de búsqueda o hay una solución que sería más eficiente con la memoria?
Brad G.

3

Aunque esto probablemente no sea tan apropiado para esta situación, descubrí el otro día que también puede usar la deletepalabra clave para eliminar un elemento de una matriz si no necesita alterar el tamaño de la matriz, por ejemplo

var myArray = [1,2,3];

delete myArray[1];

console.log(myArray[1]); //undefined

console.log(myArray.length); //3 - doesn't actually shrink the array down

3

Esta respuesta

for (var i =0; i < someArray.length; i++)
   if (someArray[i].name === "Kristian") {
      someArray.splice(i,1);
   }

no funciona para múltiples registros que cumplan la condición. Si tiene dos de estos registros consecutivos, solo se eliminará el primero y se saltará el otro. Tienes que usar:

for (var i = someArray.length - 1; i>= 0; i--)
   ...

en su lugar


2

Parece que hay un error en la sintaxis de su matriz, por lo que suponiendo que se refiere a una matriz en lugar de un objeto, Array.splice es su amigo aquí:

someArray = [{name:"Kristian", lines:"2,5,10"}, {name:"John", lines:"1,19,26,96"}];
someArray.splice(1,1)

2

Puede usar la función de mapa también.

someArray = [{name:"Kristian", lines:"2,5,10"},{name:"John",lines:"1,19,26,96"}];
newArray=[];
someArray.map(function(obj, index){
    if(obj.name !== "Kristian"){
       newArray.push(obj);
    }
});
someArray = newArray;
console.log(someArray);

1
Pero si quieres recorrer la matriz, ¿no es mejor usar forEach?
corse32

2

También puedes usar some:

someArray = [{name:"Kristian", lines:"2,5,10"},
             {name:"John", lines:"1,19,26,96"}];

someArray.some(item => { 
    if(item.name === "Kristian") // Case sensitive, will only remove first instance
        someArray.splice(someArray.indexOf(item),1) 
})

2

Esto es lo que yo uso.

Array.prototype.delete = function(pos){
    this[pos] = undefined;
    var len = this.length - 1;
    for(var a = pos;a < this.length - 1;a++){
      this[a] = this[a+1];
    }
    this.pop();
  }

Entonces es tan simple como decir

var myArray = [1,2,3,4,5,6,7,8,9];
myArray.delete(3);

Reemplace cualquier número en lugar de tres. Después de la salida esperada debe ser:

console.log(myArray); //Expected output 1,2,3,5,6,7,8,9

2

Si desea eliminar todas las apariciones de un objeto determinado (basado en alguna condición), utilice el método de empalme de JavaScript dentro de a para el bucle.

Dado que la eliminación de un objeto afectaría la longitud de la matriz, asegúrese de disminuir el contador un paso, para que la verificación de longitud permanezca intacta.

var objArr=[{Name:"Alex", Age:62},
  {Name:"Robert", Age:18},
  {Name:"Prince", Age:28},
  {Name:"Cesar", Age:38},
  {Name:"Sam", Age:42},
  {Name:"David", Age:52}
];

for(var i = 0;i < objArr.length; i ++)
{
  if(objArr[i].Age > 20)
  {
    objArr.splice(i, 1);
    i--;  //re-adjust the counter.
  }
}

El fragmento de código anterior elimina todos los objetos con una edad superior a 20.



1

El empalme (i, 1) donde i es el índice incremental de la matriz eliminará el objeto. Pero recuerde que el empalme también restablecerá la longitud de la matriz, así que tenga cuidado con 'indefinido'. Usando su ejemplo, si elimina 'Kristian', en la próxima ejecución dentro del ciclo, seré 2 pero someArray tendrá una longitud de 1, por lo tanto, si intenta eliminar "John" obtendrá un error "indefinido" . Una solución a esto, aunque no elegante, es tener un contador separado para realizar un seguimiento del índice del elemento que se va a eliminar.


1

Devuelve solo objetos de la matriz cuya propiedad nameno es "Kristian"

var noKristianArray = $.grep(someArray, function (el) { return el.name!= "Kristian"; });


Manifestación:

 var someArray = [
                {name:"Kristian", lines:"2,5,10"},
                {name:"John", lines:"1,19,26,96"},
                {name:"Kristian", lines:"2,58,160"},
                {name:"Felix", lines:"1,19,26,96"}
                ];
			 
var noKristianArray = $.grep(someArray, function (el) { return el.name!= "Kristian"; });

console.log(noKristianArray);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


0

Estos conceptos usando Kendo Grid

var grid = $("#addNewAllergies").data("kendoGrid");

var selectedItem = SelectedCheckBoxList;

for (var i = 0; i < selectedItem.length; i++) {
    if(selectedItem[i].boolKendoValue==true)
    {
        selectedItem.length= 0;
    }
}

0

Supongo que las respuestas son muy ramificadas y anudadas.

Puede usar la siguiente ruta para eliminar un objeto de matriz que coincida con el objeto dado en la jerga moderna de JavaScript.


coordinates = [
    { lat: 36.779098444109145, lng: 34.57202827508546 },
    { lat: 36.778754712956506, lng: 34.56898128564454 },
    { lat: 36.777414146732426, lng: 34.57179224069215 }
];

coordinate = { lat: 36.779098444109145, lng: 34.57202827508546 };

removeCoordinate(coordinate: object) {
  const found = this.coordinates.find((obj) => obj === obj);
  if (found) {
    this.coordinates.splice(found, 1);
  }
}

this.removeCoordinate(coordinate);

-2

Si desea acceder y eliminar el objeto de una matriz, simplemente puede intentar algo como esto.

// inside some function

let someArray = [ {"ColumnName" : "a", "PropertySerno" : 100005,"UpdateType" : 1},
                  {"ColumnName" : "b", "PropertySerno" : 100202,"UpdateType" : 1,
        "ShowRemoveButton" : true} ];
        
        for (let item of someArray) {
          delete item.ShowRemoveButton;
        }
        console.log(item.outputMappingData.Data);
        
//output will be like that = [ {"ColumnName" : "a", "PropertySerno" : 100005,"UpdateType" : 1},
//                             {"ColumnName" : "b", "PropertySerno" : 100202,"UpdateType" : 1 }];
        

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.