Estoy buscando un método de inserción de matriz de JavaScript, en el estilo de:
arr.insert(index, item)
Preferiblemente en jQuery, pero cualquier implementación de JavaScript funcionará en este punto.
javascript
jquery
arrays
etiquetas2k
fuente
fuente
Respuestas:
Lo que desea es la
splice
función en el objeto de matriz nativa.arr.splice(index, 0, item);
se insertaráitem
enarr
el índice especificado (eliminando0
elementos primero, es decir, es solo una inserción).En este ejemplo crearemos una matriz y le agregaremos un elemento en el índice 2:
fuente
arr.splice(2,3)
eliminará 3 elementos comenzando en el índice 2. Sin pasar el 3er .... Enésimo parámetro no se inserta nada. Entonces el nombreinsert()
tampoco le hace justicia.Puede implementar el
Array.insert
método haciendo esto:Entonces puedes usarlo como:
fuente
Array.prototype.insert = function (index, items) { this.splice.apply(this, [index, 0].concat(items)); }
Además del empalme, puede usar este enfoque que no mutará la matriz original, pero creará una nueva matriz con el elemento agregado. Por lo general, debe evitar la mutación siempre que sea posible. Estoy usando el operador de propagación ES6 aquí.
Esto se puede usar para agregar más de un elemento ajustando un poco la función para usar el operador de descanso para los nuevos elementos, y difundir eso también en el resultado devuelto
fuente
insert
Métodos de matriz personalizados1. Con múltiples argumentos y soporte de encadenamiento
Puede insertar múltiples elementos (como lo
splice
hace el nativo ) y admite el encadenamiento:2. Con soporte de fusión y encadenamiento de argumentos de tipo matriz
Puede fusionar matrices de los argumentos con la matriz dada y también admite el encadenamiento:
DEMO: http://jsfiddle.net/UPphH/
fuente
["b", "X", "Y", "Z", "c"]
. ¿Por qué no está"d"
incluido? Me parece que si pones 6 como el segundo parámetro deslice()
y hay 6 elementos en la matriz a partir del índice especificado, entonces deberías obtener los 6 elementos en el valor de retorno. (El documento dicehowMany
para ese parámetro). Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(3, 3);
=>[ ]
slice
método y nosplice
, a lo que te refieres en el comentario. El segundo parámetro deslice
(namedend
) es un índice basado en cero en el que finalizar la extracción.slice
extractos hasta pero no incluidosend
. Por lo tanto, después deinsert
que tiene["a", "b", "X", "Y", "Z", "c", "d"]
, de dondeslice
extrae elementos con índices de1
hasta6
, es decir, de"b"
hasta"d"
pero no incluidos"d"
. ¿Tiene sentido?Si desea insertar varios elementos en una matriz a la vez, consulte esta respuesta de desbordamiento de pila: una mejor manera de empalmar una matriz en una matriz en javascript
También aquí hay algunas funciones para ilustrar ambos ejemplos:
Finalmente, aquí hay un jsFiddle para que pueda verlo por usted mismo: http://jsfiddle.net/luisperezphd/Wc8aS/
Y así es como usas las funciones:
fuente
Para fines de programación funcional y encadenamiento adecuados,
Array.prototype.insert()
es esencial una invención . En realidad, el empalme podría haber sido perfecto si hubiera devuelto la matriz mutada en lugar de una matriz vacía totalmente sin sentido. Así que aquí vaBien, lo anterior con el
Array.prototype.splice()
que muta la matriz original y algunos podrían quejarse como "no deberías modificar lo que no te pertenece" y eso podría resultar correcto también. Entonces, para el bienestar público, me gustaría dar otroArray.prototype.insert()
que no mute la matriz original. Aquí va;fuente
splice
muta la matriz original, no creo que la "programación funcional adecuada" pertenezca a ninguna parte cercanasplice
.Recomiendo usar JavaScript puro en este caso, tampoco hay un método de inserción en JavaScript, pero tenemos un método que es un método Array incorporado que hace el trabajo por usted, se llama empalme ...
Veamos qué es splice () ...
OK, imagina que tenemos esta matriz a continuación:
Podemos eliminar
3
así:Devolverá 3, pero si verificamos el arr ahora, tenemos:
Hasta ahora, todo bien, pero ¿cómo podemos agregar un nuevo elemento a la matriz usando empalme? Pongamos de nuevo 3 en el arr ...
Veamos que hemos hecho ...
Usamos el empalme nuevamente, pero esta vez para el segundo argumento, pasamos 0 , significa que no queremos eliminar ningún elemento, pero al mismo tiempo, agregamos un tercer argumento que es 3 que se agregará en el segundo índice ...
Debe tener en cuenta que podemos eliminar y agregar al mismo tiempo, por ejemplo, ahora podemos hacer:
Lo cual eliminará 2 elementos en el índice 2, luego agregará 3 en el índice 2 y el resultado será:
Esto muestra cómo funciona cada elemento en el empalme:
fuente
Agregar elemento individual en un índice específico
Agregar elementos múltiples en un índice específico
fuente
arrName[3] = 'newName1';
se agregará si la matriz tiene solo 3 elementos. Si hay un elemento en el índice 3, este será reemplazado. Si desea agregar al final, es mejor usarloarrName.push('newName1');
Otra posible solución, con el uso de
Array#reduce
.fuente
Aquí hay dos formas:
O
fuente
Aunque esto ya ha sido respondido, estoy agregando esta nota para un enfoque alternativo.
Quería colocar un número conocido de elementos en una matriz, en posiciones específicas, ya que provienen de una "matriz asociativa" (es decir, un objeto) que por definición no se garantiza que esté en un orden ordenado. Quería que la matriz resultante fuera una matriz de objetos, pero los objetos estarían en un orden específico en la matriz ya que una matriz garantiza su orden. Entonces hice esto.
Primero el objeto fuente, una cadena JSONB recuperada de PostgreSQL. Quería ordenarlo por la propiedad "orden" en cada objeto secundario.
Como se conoce el número de nodos en el objeto, primero creo una matriz con la longitud especificada:
Y luego itere el objeto, colocando los objetos temporales recién creados en las ubicaciones deseadas en la matriz sin que realmente tenga lugar ninguna "clasificación".
fuente
Cualquiera que todavía tenga problemas con este y haya probado todas las opciones anteriores y nunca lo haya obtenido. Estoy compartiendo mi solución, esto es para tener en cuenta que no desea indicar explícitamente las propiedades de su objeto frente a la matriz.
Esta es una combinación de iterar la matriz de referencia y compararla con el objeto que desea verificar, convertir ambos en una cadena y luego iterar si coincide. Entonces puedes contar. Esto se puede mejorar, pero aquí es donde me instalé. Espero que esto ayude.
fuente
Aprovechando el método de reducción de la siguiente manera:
Entonces, de esta manera podemos devolver una nueva matriz (será una forma funcional genial, mucho mejor que usar push o splice) con el elemento insertado en el índice, y si el índice es mayor que la longitud de la matriz, se insertará al final.
fuente
Array#splice()
es el camino a seguir, a menos que realmente desee evitar mutar la matriz. Dado 2 matricesarr1
yarr2
, he aquí cómo usted insertar el contenido dearr2
dentroarr1
después de que el primer elemento:Si le preocupa la mutación de la matriz (por ejemplo, si usa Immutable.js), puede usar
slice()
, no confundir consplice()
a'p'
.fuente
¡Intenté esto y está funcionando bien!
El índice es la posición donde desea insertar o eliminar el elemento. 0 es decir, el segundo parámetro define la cantidad de elementos del elemento que se eliminará del índice que son las nuevas entradas que desea hacer en la matriz. Puede ser uno o más de uno.
fuente
Aquí hay una función de trabajo que uso en una de mis aplicaciones.
Esto comprueba si el elemento sale
Y luego lo llamo a continuación.
fuente
Un poco más antiguo, pero tengo que estar de acuerdo con Redu anterior porque el empalme definitivamente tiene una interfaz un poco confusa. Y la respuesta dada por cdbajorin de que "solo devuelve una matriz vacía cuando el segundo parámetro es 0. Si es mayor que 0, devuelve los elementos eliminados de la matriz" es, si bien exacto, prueba el punto. La intención de la función es empalmar o, como dijo anteriormente Jakob Keller, "unirse o conectarse, también cambiar. Tiene una matriz establecida que ahora está cambiando que implicaría agregar o eliminar elementos ..." Dado eso, el El valor de retorno de los elementos, si los hay, que se eliminaron es, en el mejor de los casos, incómodo. Y estoy 100% de acuerdo en que este método podría haber sido más adecuado para encadenar si hubiera devuelto lo que parece natural, una nueva matriz con los elementos empalmados agregados. Entonces podría hacer cosas como ["19", "17"]. Empalmar (1,0, "18"). Unirse ("...") o lo que quiera con la matriz devuelta. El hecho de que devuelva lo que se eliminó es simplemente una tontería en mi humilde opinión. Si la intención del método era "cortar un conjunto de elementos" y esa era su única intención, tal vez. Sin embargo, parece que si no sé lo que estoy cortando, probablemente tenga pocas razones para eliminar esos elementos, ¿no? Sería mejor si se comportara como concat, map, reduce, slice, etc., donde se crea una nueva matriz a partir de la matriz existente en lugar de mutar la matriz existente. Esos son todos encadenados, y ES un problema importante. Es bastante común en la manipulación de la matriz de cadena. Parece que el idioma necesita ir en una u otra dirección y tratar de mantenerlo lo más posible. Javascript es funcional y menos declarativo, solo parece una extraña desviación de la norma.
fuente
Actuación
Hoy (2020.04.24) realizo pruebas para soluciones elegidas para matrices grandes y pequeñas. Los probé en MacOs High Sierra 10.13.6 en Chrome 81.0, Safari 13.1, Firefox 75.0.
Conclusiones
Para todos los navegadores
slice
yreduce
(D, E, F) suelen ser 10x-100x más rápidas que las soluciones in situ.splice
(AI, BI, CI) fueron más rápidas (a veces ~ 100x, pero depende del tamaño de la matriz)Detalles
Las pruebas se dividieron en dos grupos: soluciones en el lugar (AI, BI, CI) y soluciones no en el lugar (D, E, F) y se realizaron durante dos casos
El código probado se presenta en el siguiente fragmento
Mostrar fragmento de código
Los resultados de ejemplo para una matriz pequeña en Chrome están a continuación
fuente