Problema de tipo de datos en la detección del índice de matriz de JavaScript

Al escribir cartas antes del programa de microproyectos pequeños, que tiene una función "City Select", utilizo el <picker-view>componente, este componente es bastante especial, porque sus valuepropiedades se prescriben en un formato de matriz . Por value="[1]"ejemplo:.

Debido a que no entendía la conversión de tipo de variable JS en ese momento, el autor escribió las siguientes líneas de juicio en el código: (esto es riguroso)

let val_one=typeof this.data.pIndex=="number"?[this.daya.pIndex]:this.data.pIndex

(: ¡Los elementos de acceso en el proyecto son dinámicos!

Esto se debe a que para hacer que los subíndices anteriores sigan al usuario para seleccionar dinámicamente y retroalimentar al wxml en valuela visualización de atributos.
Pero antes de eso, todavía necesitamos hacer una capa de juicio, porque algunas áreas son ciudades o municipios a nivel provincial, y los usuarios deben evitar que los usuarios "falsifiquen", como levantarse o retirarse repentinamente. En este momento, está en el subprograma WeChat. Se informará un error si no se pueden encontrar los datos correspondientes:

let length=placeArray[val_one].sub.length
if(val[0]>=length){
    
    
  val=[length-1]
}else if(val[0]<0){
    
    
  val=[0]
}

Más tarde, cuando volví a optimizar el código de este proyecto, descubrí que esto (convertir la matriz en un número cuando se ve obligado a usarlo y convertir el número en una matriz cuando la retroalimentación) es realmente innecesario:
detalle

JavaScript parece tener su propia forma "única" de procesar datos, pero el autor aún no ha encontrado información relevante ~~


Cómo juzgar si un valor se puede usar como un subíndice de matriz (índice)

Pero lo que es seguro es: la asignación de claves de atributos enteros es un caso especial de matrices, porque se manejan de manera diferente a las claves que no son enteros. Para determinar si una propiedad se puede usar como índice de una matriz, encontré un pasaje en el documento de especificación ES6:

Solo cuando la corriente ToString(ToUint32(P))es igual a P, y ToUint32(P)no igual a 2^32-1, el nombre de la propiedad P es un índice de matriz de cadenas.

Esta operación se puede lograr con JS:

function toUint32(value){
    
    
	return Math.floor(Math.abs(Number(value))) % Math.pow(2,32);
}
function isArrayIndex(key){
    
    
	let numericKey=toUint32(key);
	return String(numericKey) == key && numericKey < (Math.pow(2,32)-1);
}
  1. toUint32() La función convierte el valor dado en un entero de 32 bits sin signo a través del algoritmo descrito en la especificación;
  2. isArrayIndex()En la función, la clave se convierte primero a una estructura uint32 y luego se realizan dos comparaciones (la toString()última no es igual al número original y es menor que 2^32-1)

Con esta base, podemos basarnos en esta simple imitación del new Array()comportamiento, lo más importante sobre la longitud de la descripción:
array_length

function createArray(length=0){
    
    
	return new Proxy({
    
     length },{
    
    
		set(trapTarget,key,value){
    
    
			let currentLength=Reflect.get(trapTarget,"length");
			if(isArrayIndex(key)){
    
    
				let numericKey=Number(key);
				if(numericKey >= currentLength){
    
    
					Reflect.set(trapTarget,"length",numericKey+1);
				}
			}else if(key === "length"){
    
    
				if(value < currentLength){
    
    
					for(let index=currentLength-1;index >= value;index--){
    
    
						Reflect.deleteProperty(trapTarget,index);
					}
				}
			}
			// 无论key是什么类型都要执行这段代码
			return Reflect.set(trapTarget,key,value);
		}
	});
}

Experimentar:
myArray_test

Supongo que te gusta

Origin blog.csdn.net/qq_43624878/article/details/112388692
Recomendado
Clasificación