¿Cómo insertar un elemento en una matriz en un índice específico?

Estoy buscando un método de inserción de matriz javascript en el estilo:

 arr.insert(index, item) 

Preferiblemente en jQuery, pero cualquier implementación de javascript funcionará en este punto.

2294
25 февр. establecer a tags2k 25 de febrero 2009-02-25 17:29 '09 a las 17:29 2009-02-25 17:29
@ 14 respuestas

Lo que quieres es la función de splice en tu propia matriz.

arr.splice(index, 0, item); insertará el item en arr en el índice especificado (primero eliminando 0 elementos, es decir, solo insertando).

En este ejemplo, crearemos una matriz y le agregaremos un elemento en el índice 2:

3766
25 февр. La respuesta la da tvanfosson el 25 de febrero. 2009-02-25 17:32 '09 a las 17:32 2009-02-25 17:32

Puede implementar el método Array.insert siguiendo estos pasos:

 Array.prototype.insert = function ( index, item ) { this.splice( index, 0, item ); }; 
border=0

Entonces puedes usarlo así:

 var arr = [ 'A', 'B', 'D', 'E' ]; arr.insert(2, 'C'); // => arr == [ 'A', 'B', 'C', 'D', 'E' ] 
227
03 окт. La respuesta está dada por FrEsC 81 03 oct. 2012-10-03 17:26 '12 a las 5:26 pm 2012-10-03 17:26

Métodos personalizados de matriz de insert

1. Con unos pocos argumentos y soporte de encadenamiento.

  Array.prototype.insert = function(index) { this.splice.apply(this, [index, 0].concat( Array.prototype.slice.call(arguments, 1))); return this; }; 

Puede insertar varios elementos (como un splice nativo) y admite la cadena:

 ["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(1, 6); // ["b", "X", "Y", "Z", "c"] 

2. Con soporte de matriz para fusión y vinculación de argumentos

  Array.prototype.insert = function(index) { index = Math.min(index, this.length); arguments.length > 1  this.splice.apply(this, [index, 0].concat([].pop.call(arguments)))  this.insert.apply(this, arguments); return this; }; 

Puede combinar matrices de argumentos con una matriz dada, y también admite una cadena:

 ["a", "b", "c", "d"].insert(2, "V", ["W", "X", "Y"], "Z").join("-"); // "abVWXYZcd" 

DEMO: http://jsfiddle.net/UPphH/

66
25 марта '13 в 20:45 2013-03-25 20:45 VisioN dio la respuesta el 25 de marzo de 2013 a las 20:45 2013-03-25 20:45

Además del empalme, puede utilizar este enfoque, que no mutará la matriz original, sino que creará una nueva matriz con el elemento agregado. Normalmente debes evitar las mutaciones. Yo uso el operador de propagación es6 aquí.

63
04 июля '16 в 12:18 2016-07-04 12:18 Gaafar da la respuesta el 4 de julio de 2016 a las 12:18 2016-07-04 12:18

Si desea insertar varios elementos en una matriz a la vez, verifique esta respuesta: la mejor manera de unir una matriz en una matriz en javascript

También aquí hay algunas características que ilustran ambos ejemplos:

 function insertAt(array, index) { var arrayToInsert = Array.prototype.splice.apply(arguments, [2]); return insertArrayAt(array, index, arrayToInsert); } function insertArrayAt(array, index, arrayToInsert) { Array.prototype.splice.apply(array, [index, 0].concat(arrayToInsert)); return array; } 

Finalmente, aquí está jsFiddle para que lo puedas ver por ti mismo: http://jsfiddle.net/luisperezphd/Wc8aS/

Así es como usas las funciones:

 // if you want to insert specific values whether constants or variables: insertAt(arr, 1, "x", "y", "z"); // OR if you have an array: var arrToInsert = ["x", "y", "z"]; insertArrayAt(arr, 1, arrToInsert); 
32
30 авг. Respuesta de Luis Pérez 30 de agosto. 2012-08-30 07:37 '12 a las 7:37 am 2012-08-30 07:37

Para una programación y un enfoque funcionales adecuados, es importante inventar Array.prototype.insert() . De hecho, el empalme podría ser perfecto si devuelve una matriz mutada en lugar de una matriz vacía completamente sin sentido. Así que aquí está

15
14 мая '16 в 2:22 2016-05-14 02:22 respuesta es dada a Redu el 14 de mayo de '16 a las 2:22. 2016-05-14 02:22

En este caso, recomiendo usar JavaScript puro, tampoco hay un método de inserción en JavaScript, pero tenemos un método que es un método de Array integrado que realiza la tarea para usted, se llama empalme ...

Veamos ese empalme () ...

El método splice () cambia el contenido de una matriz al eliminar elementos existentes y / o agregar nuevos elementos.

OK, imagina que tenemos esta matriz a continuación:

 const arr = [1, 2, 3, 4, 5]; 

Podemos eliminar 3 siguiente manera:

 arr.splice(arr.indexOf(3), 1); 

Devolverá 3, pero si comprobamos arr ahora, tenemos:

 [1, 2, 4, 5] 

Hasta ahora todo bien, pero ¿cómo podemos agregar un nuevo elemento a una matriz mediante el empalme? Deje que vuelva 3 en ...

 arr.splice(2, 0, 3); 

A ver que hicimos ...

Usamos el empalme nuevamente, pero esta vez para el segundo argumento, pasamos 0 , lo que significa que queremos eliminar el elemento, pero al mismo tiempo agregaremos el tercer argumento, que se agregará en el segundo índice ...

Debe saber qué podemos eliminar y agregar al mismo tiempo, por ejemplo, ahora podemos hacer:

 arr.splice(2, 2, 3); 

Lo que eliminará 2 elementos en el índice 2, luego agregará 3 en el índice 2, y el resultado será:

 [1, 2, 3, 5]; 

Esto muestra cómo funciona cada elemento en el empalme:

array.splice (inicio, deleteCount, item1, item2, item3 ...)

9
25 дек. La respuesta la da Alireza el 25 dic. 2017-12-25 16:04 '17 a las 4:04 pm 2017-12-25 16:04

Esto es

 var arr= ["India","China","Japan","USA"]; arr.splice(index, 0, item); 

Introduce el elemento en arr con el index especificado (primero eliminando 0 elementos, es decir, solo insertando).

8
24 февр. la respuesta la da hannad rehman el 24 de febrero. 2017-02-24 16:29 '17 a las 4:29 pm 2017-02-24 16:29

Otra posible solución es usar Array#reduce .

5
05 апр. La respuesta es dada amable usuario 05 abr. 2017-04-05 20:06 '17 a las 20:06 2017-04-05 20:06

Incluso si esto ya ha sido respondido, agrego esta nota para un enfoque alternativo.

Quería poner un número conocido de elementos en una matriz en ciertas posiciones, ya que están separados 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 estaban en un orden específico en la matriz, ya que la matriz garantiza su orden. Así que lo hice.

Primero el objeto fuente, la cadena JSONB obtenida de PostgreSQL. Lo quería ordenado por la propiedad "orden" en cada objeto secundario.

 var jsonb_str = '{"one": {"abbr": "", "order": 3}, "two": {"abbr": "", "order": 4}, "three": {"abbr": "", "order": 5}, "initialize": {"abbr": "init", "order": 1}, "start": {"abbr": "", "order": 2}}'; var jsonb_obj = JSON.parse(jsonb_str); 

Dado que se conoce el número de nodos en el objeto, primero creo una matriz con la longitud especificada:

 var obj_length = Object.keys(jsonb_obj).length; var sorted_array = new Array(obj_length); 

Y luego vuelva a intentar el objeto, colocando los objetos temporales recién creados en los lugares correctos de la matriz sin ningún ordenamiento.

 for (var key of Object.keys(jsonb_obj)) { var tobj = {}; tobj[key] = jsonb_obj[key].abbr; var position = jsonb_obj[key].order - 1; sorted_array[position] = tobj; } console.dir(sorted_array); 
5
04 дек. La respuesta se da Ville 04 dec. 2015-12-04 21:36 '15 a las 21:36 2015-12-04 21:36

Añadir un solo elemento en un índice específico

 //Append at specific position(here at index 1) arrName.splice(1, 0,'newName1'); //1: index number, 0: number of element to remove, newName1: new element //Append at specific position (here at index 3) arrName[3] = 'newName1'; 

Añadir varios elementos en un índice específico

 //Append from index number 1 arrName.splice(1, 0,'newElemenet1', 'newElemenet2', 'newElemenet3'); //1: index number from where append start, //0: number of element to remove, //newElemenet1,2,3: new elements 
4
28 июня '18 в 22:13 2018-06-28 22:13 Srikrushna Pal da la respuesta el 28 de junio de 18 a las 10:13 p . m . 2018-06-28 22:13

Lo probé y funciona bien!

 var initialArr = ["India","China","Japan","USA"]; initialArr.splice(index, 0, item); 

El índice es la posición en la que desea insertar o eliminar un elemento. 0, es decir El segundo parámetro determina la cantidad de elementos del objeto que se eliminará: estos son los nuevos registros que desea crear en la matriz. Puede ser uno o más.

 initialArr.splice(2, 0, "Nigeria"); initialArr.splice(2, 0, "Australia","UK"); 
2
08 марта '17 в 9:35 2017-03-08 09:35 La respuesta la da Pawan 08 de marzo de 2017 a las 9:35 2017-03-08 09:35

Cualquiera que tenga problemas con esto, e intentó todas las opciones anteriores y nunca lo consiguió. Comparto mi decisión, se debe tener en cuenta que no desea especificar explícitamente las propiedades de su objeto y matriz.

 function isIdentical(left, right){ return JSON.stringify(left) === JSON.stringify(right); } function contains(array, obj){ let count = 0; array.map((cur) => { if(this.isIdentical(cur, obj)) count++; }); return count > 0; } 

Es una combinación de iterar una matriz de referencias y compararla con el objeto que desea verificar, convertir ambas en una cadena y luego repetir si coincide. Entonces puedes simplemente contar. Esto se puede mejorar, pero aquí es donde me instalé. Espero que esto ayude.

1
06 дек. La respuesta está dada por Clyde 06 dec. 2018-12-06 07:26 '18 a las 7:26 am 2018-12-06 07:26

Tomando ganancias por el método de reducción de la siguiente manera:

 function insert(arr, val, index) { return index >= arr.length ? arr.concat(val) : arr.reduce((prev, x, i) => prev.concat(i === index ? [val, x] : x), []); } 

Por lo tanto, de esta manera podemos devolver una nueva matriz (esta será una forma funcional genial, mucho mejor que usar empujar o unir) con el elemento insertado en el índice, y si el índice es mayor que la longitud de la matriz, se insertará al final.

0
12 янв. Respuesta dada por alejoko 12 de enero. 2019-01-12 20:04 '19 a las 8:04 pm 2019-01-12 20:04

Otras preguntas sobre etiquetas o Haga una pregunta