presentó los conceptos básicos de las matrices y algunas funciones simples de operación de elementos de la matriz. De hecho, las matrices proporcionan muchas más funciones.
push
, pop
, shift
y unshift
son funciones que operan en ambos extremos de la matriz. Se mencionaron anteriormente y no se repetirán en este artículo.
se presentó brevemente en el artículo anterior. Una matriz es un objeto especial, por lo que podemos intentar utilizar el método de eliminación de atributos del objeto: delete
.
Por ejemplo:
let arr = [1,2,3,4,5];delete arr[2];console.log(arr);
Los resultados de la ejecución del código son los siguientes:
Preste atención a la posición amarilla en la imagen. Aunque el elemento se ha eliminado, la longitud de la matriz sigue siendo 5
y hay un空
adicional en la posición eliminada. Si accedemos al elemento con índice 2
, obtendremos el siguiente resultado:
La razón de este fenómeno es que delete obj.key
elimina el valor correspondiente a través key
, es decir, delete arr[2]
elimina el par clave-valor 2:3
en la matriz. Cuando accedemos al subíndice 2
, undefined
está definido. .
En una matriz, a menudo esperamos que después de eliminar un elemento, la posición del elemento se llene con elementos posteriores y la longitud de la matriz se acorte.
En este momento, necesitamos splice()
.
debe tenerse en cuenta de antemano que splice()
es bastante versátil y no solo elimina elementos. La siguiente es la sintaxis:
arr.splice(start[,deleteCount,e1,e2,...,eN] )
método splice
Comenzando desde la posición start
, elimine los elementos deleteCount
y luego inserte e1,e2,e3
y otros elementos en su lugar.
El siguiente ejemplo puede eliminar un elemento de la matriz:
let arr = [1,2,3,4,5]arr.splice(0,1);//Eliminar el primer elemento 1console.log(arr)
El El código anterior elimina 1
elemento en la primera posición de la matriz. Los resultados de la ejecución son los siguientes:
es lo mismo que eliminar un elemento. Solo necesita cambiar el segundo parámetro al número especificado. Por ejemplo:
let arr = [1,2,3,4,5];arr. ;//Eliminar los primeros tres elementos console.log(arr);//[4,5]
Los resultados de la ejecución del código son los siguientes:
Si solo proporcionamos un parámetro start
, se eliminarán todos los elementos después de start
de la matriz. Por ejemplo:
let arr = [1,2,3,4,5]arr.splice(2); //Eliminar Console.log(arr);//:La ejecución del código [1,2] resulta
del subíndice 2 y todos los elementos posteriores
Si proporcionamos más de dos parámetros, podemos reemplazar elementos de la matriz, por ejemplo:
let arr = [1,2,3,4,5];arr.splice(0,2,'itm1',' itm2', 'itm3');console.log(arr);//['itm1','itm2','itm3',3,4,5]
Los resultados de la ejecución del código son los siguientes:
El código anterior en realidad realiza una operación de dos pasos: primero elimina 2
elementos a partir de 0
y luego inserta tres nuevos elementos en la posición 0
.
Si cambiamos el segundo parámetro (el número de eliminaciones) a 0
, entonces solo podemos insertar elementos sin eliminar elementos. Por ejemplo:
let arr = [1,2,3,4,5]arr.splice( 0, 0,'x','y','z')console.log(arr);//['x','y','z'1,2,3,4,5]
La función splice()
devolverá la matriz de elementos eliminados, por ejemplo:
let arr = [1,2,3,4,5]let res = arr.splice(0,3,'x','y' ) console.log(arr)//['x','y',4,5]console.log(res)//[1,2,3]
Resultados de la ejecución del código:
Podemos usar números negativos para indicar la posición donde comenzar a operar los elementos, por ejemplo:
let arr = [1,2,3,4,5]arr.splice(-1,1,'x','y' ,'z ')console.log(arr)//[1,2,3,4,'x','y','z']
Los resultados de la ejecución del código son los siguientes:
slice()
puede interceptar una matriz en un rango específico. La sintaxis es la siguiente:
arr.slice([inicio],[fin])
devuelve una nueva matriz que comienza desde start
y termina al end
. , pero no incluye end
.
Ejemplo:
let arr = [1,2,3,4,5]console.log(arr.slice(2,5))//[3,4,5]console.log(arr.slice(1,3) )//[2,3]
Resultado de la ejecución del código:
slice()
también puede usar subíndices negativos:
let arr = [1,2,3,4,5]console.log(arr.slice(-3))//[3,4,5]console.log(arr . slice(-5,-1))//[1,2,3,4]
Los resultados de la ejecución del código son los siguientes:
Si proporciona solo un parámetro al método slice()
, se truncará hasta el final de la matriz al igual que splice()
.
La función concat()
puede concatenar múltiples matrices u otros tipos de valores en una matriz larga. La sintaxis es la siguiente:
arr.concat(e1, e2, e3)
El código anterior devolverá una nueva matriz. la nueva matriz está concatenada por arr
Está formada por e1
, e2
y e3
.
Ejemplo:
let arr = [1,2,3]console.log(arr.concat([4,5],6,7,[8,9]))
El resultado de la ejecución del código es el siguiente:
Los objetos ordinarios, incluso si tienen el mismo aspecto que los objetos, todavía se insertan en la matriz como un todo, por ejemplo:
let arr = [1,2]let obj = {1:'1',2:2}console.log
Resultados de la ejecución del código
(arr.concat(obj)):
Sin embargo, si el objeto tiene la propiedad Symbol.isConcatSpreadable
, será tratado como una matriz:
let arr = [1,2]let obj = {0:'x', 1:'y', [Symbol.isConcatSpreadable]: verdadero, longitud: 2 }console.log(arr.concat(obj))
resultados de ejecución del código:
atraviesa toda la matriz y proporciona una función de operación para cada elemento de la matriz. Sintaxis:
let arr = [1,2]arr.forEach((itm,idx,array)=>{ ...})
Ejemplo de aplicación:
let arr = [1,2,3,4,5]arr.forEach((itm)=>{
resultados de ejecución del código
console.log(itm)}):
let arr = [1,2,3,4,5]arr.forEach((itm,idx,array)=>{ console.log(`arr[${idx}] en [${array}] es ${itm}`)})
resultados de ejecución del código:
son similares a las cadenas. indexOf
, lastIndexOf
e includes
se pueden usar con el subíndice del elemento especificado en la matriz de consulta:
arr.indexOf(itm,start)
: itm
comenzando desde start
. Si lo encuentra, devuelve el subíndice; de lo contrario, devuelve -1
;arr.lastIndexOf(itm,start)
: busca en toda la matriz en orden inverso hasta start
y devuelve el primer subíndice encontrado (es decir, el último elemento coincidente en la matriz). Si no se encuentra, devuelve -1
;arr.includes(itm,start)
: itm
desde start
, devuelve true
si lo encuentra; de lo contrario, devuelve false
.Ejemplo:
let arr = [1,2,3,4,5, 6,"7","8","9" ,0,0,true,false]console.log(arr.indexOf(0))//9console.log(arr.lastIndexOf(0))//10console. log(arr.includes(10))//falseconsole. log(arr.includes(9))//false
Estos métodos usan ===
al comparar elementos de la matriz, por lo que false
y 0
son diferentes.
Manejo de NaN
NaN
es un número especial y existen diferencias sutiles entre los tres en el manejo NaN
:
let arr = [NaN,1,2,3,NaN]console.log(arr.includes(NaN))//trueconsole. log( arr.indexOf(NaN))//-1console.log(arr.lastIndexOf(NaN))//-1El
motivo de este resultado está relacionado con las características del propio NaN
, es decir, NaN
no es igual a ningún número , incluido él mismo.
Estos contenidos se han analizado en los capítulos anteriores. Para los zapatos infantiles olvidados, recuerde revisar el pasado y aprender lo nuevo.
a menudo encuentran matrices de objetos durante el proceso de programación, y los objetos no se pueden comparar directamente usando ===
. ¿Cómo encontrar objetos que cumplan las condiciones de la matriz?
En este momento, debe utilizar find
y findIndex
. La sintaxis es la siguiente:
let result = arr.find(function(itm,idx,array){. // elemento de matriz itm // subíndice del elemento idx // matriz de matriz misma // pasa una función de juicio, si la función devuelve verdadero, devuelve el objeto actual itm})
Por ejemplo, buscamos objetos cuyo atributo name
sea igual a xiaoming
:
let arr =[ {id:1,nombre:'xiaoming'}, {id:2,nombre:'xiaohong'}, {id:3,nombre:'xiaojunn'},]let xiaoming = arr.find(function(itm,idx,array){ if(itm.name == 'xiaoming')return true;})console.log(xiaoming)
resultado de la ejecución del código:
Si no hay ningún objeto que cumpla las condiciones, se devolverá undefined
.
El código anterior también se puede simplificar a:
let xiaoming = arr.find((itm)=> itm.name == 'xiaoming').
El efecto de ejecución es exactamente el mismo.
El propósito de arr.findIndex(func)
es casi el mismo que el arr.find(func)
La única diferencia es que arr.findIndex
devuelve el subíndice del objeto calificado en lugar del objeto en sí. -1
.
find
y findIndex
solo pueden encontrar un objeto que cumpla con los requisitos. Si hay varios objetos que cumplen con los requisitos en una matriz, debe usar filter
. La sintaxis es la siguiente:
let results = arr.filter(function(. itm,idx,matriz){ //Mismo uso que buscar, pero devolverá una matriz de objetos que cumplan los requisitos //Si no se encuentra, se devolverá una matriz vacía})
Por ejemplo:
let arr =[ {id:1,nombre:'xiaoming'}, {id:2,nombre:'xiaohong'}, {id:3,nombre:'xiaojunn'},]let res = arr.filter(function(itm,idx,array){ if(itm.name == 'xiaoming' || itm.name == 'xiaohong')return true;})console.log(res)
resultado de la ejecución del código:
El métodoarr.map
puede llamar a una función en cada objeto de la matriz y luego devolver la matriz procesada. Este es uno de los métodos de matrices más útiles e importantes.
Sintaxis:
let arrNew = arr.map(function(itm,idx,array){ //Devuelve nuevo resultado})
Por ejemplo, devuelve la matriz de longitud correspondiente a la matriz de cadenas:
let arr = ['I','am','a','student']let arrNew = arr.map((itm) = >itm.length)//return itm.lengthconsole.log(arrNew)//[1,2,1,7]
resultado de la ejecución del código:
arr.sort
ordena la matriz en su lugar y devuelve la matriz ordenada. Sin embargo, dado que la matriz original ha sido modificada, el valor de retorno en realidad no tiene sentido.
La llamada clasificación in situ significa ordenar dentro del espacio de la matriz original en lugar de crear una nueva matriz
let arr = ['a','c','b']arr.sort()console.log(arr)
ejecución del código resultado:
Tenga en cuenta que, de forma predeterminada, el método
sort
ordena en orden alfabético , lo cual es adecuado para ordenar cadenas. Si desea ordenar otros tipos de matrices, debe personalizar el método de comparación
para matrices numéricas,
let arr = [1,3,2]. ordenar(función(a,b){ si(a > b)devuelve 1; si (a < b) devuelve -1; devolver 0;})
Resultado de la ejecución del código:
sort
utiliza internamente el algoritmo de clasificación rápida, o puede ser el algoritmo timsort
, pero no necesitamos preocuparnos por esto, solo debemos prestar atención a la función de comparación.
La función de comparación puede devolver cualquier valor numérico, un número positivo significa >
, un número negativo significa <
y 0
significa igual, por lo que podemos simplificar el método de comparación numérica:
sea arr = [1,3,2]arr.sort(( a,b)=> a - b)
Si desea ordenar en orden inverso, simplemente intercambie las posiciones de a
y b
:
sea arr = [1,3,2]arr.sort((a,b)=> b - a)Clasificación
de cadenas
¿Olvidó utilizar str.localeCompare(str1)
para comparar cadenas?
let arr = ['asdfas','success','failures']arr.sort((a,b)=>a.localeCompare (b))
código Resultado de la ejecución:
arr.reverse
se usa para matrices inversas
let arr = [1,2,3]arr.reverse()console.log(arr)//[3,2,1]
No hay nada que decir al respecto.
¿Recuerdas la función de división de cadenas? La función de división de cadenas puede dividir la cadena en una matriz de caracteres:
let str = 'xiaoming,xiaohong,xiaoli'let arr = str.split(',')//['xiaoming','xiaohong','xiali']
Impopular conocimiento, la función
split
tiene un segundo parámetro, que puede limitar la longitud de la matriz generadalet str = 'xiaoming,xiaohong,xiaoli'let arr = str.split(',',2)//['xiaoming',' xiaohong' ]
El método arr.join()
es lo opuesto al método split
. Puede combinar una matriz en una cadena.
Por ejemplo:
let arr = [1,2,3]let str = arr.join(';')console.log(str)
resultado de la ejecución del código:
arr.reduce
es similar al método arr.map
. Ambos pasan un método y luego llaman a este método en los elementos de la matriz en secuencia. La diferencia es que cuando app.map
procesa los elementos de la matriz, cada uno. La llamada al elemento es independiente y arr.reduce
pasará el resultado de la llamada del elemento anterior al método de procesamiento del elemento actual.
Sintaxis:
let res = arr.reduce(function(prev,itm,idx,array){ //prev es el resultado devuelto por la llamada al elemento anterior //init servirá como resultado de la llamada al elemento anterior cuando se ejecute el primer elemento}, [init])
Imagínese cómo implementar la suma de elementos de la matriz compuesta por ¿números? No hay forma de implementar el mapa. En este momento, debe usar arr.reduce
:
let arr = [1,2,3,4,5]let res = arr.reduce((sum,itm)=>sum+. itm,0) console.log(res)//15
El proceso de ejecución del código es el siguiente:
arr.reduceRight
tiene el mismo propósito que arr.reduce
, excepto que los métodos se invocan en elementos de derecha a izquierda.
La matriz es un caso especial de objeto. El uso de typeof
no puede distinguir con precisión la diferencia entre los dos:
console.log(typeof {})//objectconsole.log(typeof [])//object
Ambos son objetos, nosotros. Es necesario utilizar Array.isArray()
para hacer más juicios:
console.log(Array.isArray({}))//falseconsole.log(Array.isArray([]))//true
arr.some(func)
Los métodos arr.some(func)
y arr.every(func)
se utilizan para verificar números y el mecanismo de ejecución es similar al map
.
algunos
ejecutan el método pasado en cada elemento de la matriz. Si el método devuelve true
, devuelve true
inmediatamente. Si todos los elementos no devuelven true
, devuelve false
.
each
ejecuta el método pasado en cada elemento de la matriz y devuelve true
si todos los elementos devuelven true
; de lo contrario, devuelve false
.
Por ejemplo:
let arr = [1,2,3,4,5]//Determinar si hay elementos mayores que 2 en la matriz console.log(arr.some((itm)=>{ if(itm > 2)return true;}))//true//Determine si todos los elementos son mayores que 2console.log(arr.every((itm)=>{ if(itm > 2)return true;}))//false
En todos los métodos de matriz, excepto sort
, hay un parámetro fijo poco común thisArg
. La sintaxis es la siguiente:
arr.find(func,thisArg)arr.filter(. func,thisArg)arr.map(func,thisArg)
Si pasamos thisArg
, se convertirá this
en func
.
Este parámetro es de poca utilidad en circunstancias normales, pero si func
es un método miembro (método de un objeto) y this
usa en el método, entonces thisArg
será muy significativo.
Por ejemplo:
let obj = { número: 3, func(itm){ consola.log(esto) return itm > this.num;//Buscar números mayores que 3}}let arr = [1,2,3,4,5,6,7]let newArr = arr.filter(obj.func,obj)console.log (newArr)
resultado de la ejecución del código:
Aquí podemos ver que this
en func
es el valor thisArg
que pasamos.
Si usamos métodos de miembro de objeto sin especificar el valor de thisArg
, this
será undefined
, lo que resultará en un error de programa.