Disculpe la pregunta de los principiantes, todavía soy muy nuevo en javascript.
Antecedentes :
Estoy creando un gráfico que debe tener 2 matrices diferentes, pero su longitud debe coincidir. Para que estas matrices coincidan en longitud, necesito determinar valores que coincidan y valores que no usen fechas (esto ya se logró, ¡solo da una idea!)
Problema :
Necesito crear una nueva matriz que tenga la misma longitud que la matriz 2 (ejemplo a continuación), manteniendo los datos existentes de la matriz 1.
Por ejemplo: la matriz a la que quiero agregar se parece a esto:
[1, 5, 10, 35, ...etc]Y tiene una longitud de 20.
La otra matriz (aquella en la que he asignado valores que coinciden/no coinciden) se ve así:
[{date, matched: false}, {date, matched: true}, {date, matched: true}, {date, matched: false}, ...etc]Y tiene una longitud de 30.
Básicamente, lo que estoy tratando de hacer es que para cada valor donde coincida = falso, deseo insertar un 0 en la primera matriz (o crear una nueva matriz donde el valor = 0). Sin embargo, cuando la coincidencia es verdadera, deseo mantener el valor existente en la primera matriz. Tengo problemas para usar bucles ya que las longitudes y los índices son diferentes entre los dos.
¿Alguien puede proporcionar alguna idea sobre cómo lograr esto?
¡Gracias! :D
No estoy seguro de si esto es lo que tenía en mente, pero puede usar Array#map (agarrando el índice) para encontrar si devolver o no el valor real, o cero.
array1.map((a,i) => array2[i].matched ? a : 0) let array1=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; let array2 = [{date:'2022/04/25', matched: false}, {date:'2022/04/25', matched: true}, {date:'2022/04/25', matched: true}, {date:'2022/04/25', matched: false},{date:'2022/04/25', matched: false}, {date:'2022/04/25', matched: true}, {date:'2022/04/25', matched: true}, {date:'2022/04/25', matched: false},{date:'2022/04/25', matched: false}, {date:'2022/04/25', matched: true}, {date:'2022/04/25', matched: true}, {date:'2022/04/25', matched: false},{date:'2022/04/25', matched: false}, {date:'2022/04/25', matched: true}, {date:'2022/04/25', matched: true}, {date:'2022/04/25', matched: false},{date:'2022/04/25', matched: false}, {date:'2022/04/25', matched: true}, {date:'2022/04/25', matched: true}, {date:'2022/04/25', matched: false},{date:'2022/04/25', matched: false}, {date:'2022/04/25', matched: true}, {date:'2022/04/25', matched: true}, {date:'2022/04/25', matched: false},{date:'2022/04/25', matched: false}, {date:'2022/04/25', matched: true}, {date:'2022/04/25', matched: true}, {date:'2022/04/25', matched: false}] let matched = array1.map((a,i) => array2[i].matched ? a : 0); console.log(matched)¿Qué has probado?
¿Qué sucede cuando matriz2, una matriz de objetos, encuentra valores falsos de coincidencia para los que no hay índice en la matriz 1? ¿Qué valor se almacena en matriz1 cuando matriz2 es mayor y coincide con verdadero?
arr1 [1, 5, 10, 35] // 0 1 2 3 arr2 [ {date, matched: false}, {date, matched: true}, ...., {date, matched: false} // indice 30 ]; arr1 [0,5,10,35,undefined?,null?,another_data?,0]Puedes usar un bucle for pero forEach() es más simple, ¡veamos!
array2.forEach((element,index)=>{ // Body of the loop and this code is executed for each element if(!element.matched){ // at each iteration index represents the position of the element en array2 array1[index] = 0; } })El código recorre la matriz de objetos a través de cada elemento y su índice , luego, en cada iteración, verificamos el valor coincidente de cada elemento ({matched:true,..}).
Si emparejado es falso (! verdadero), entonces en la posición de índice que tiene un elemento en matriz2, asignaremos 0 en matriz1.
La desventaja de esto es que solo se establecen valores falsos, lo que dejará una matriz con valores indefinidos .
Otra opción si solo desea mantener la longitud de array1 podría ser iterar sobre esta matriz y no sobre array2
array1.forEach((element,index)=>{ if(!array2[index].matched) array1[index] = 0; });De esta forma array1 mantiene su longitud pero descartamos el resto de elementos de array2.
Tenga en cuenta que solo uso index y no element , podría haber establecido el valor de element en 0 en lugar de array1[index], que es lo mismo al final, pero quería ser más pedagógico. Como no estamos interesados en el elemento, usemos un común para.
for(let index = 0; index < array1.length; index++){ if(!array2[index].matched) array1[index] = 0; }Pero todo depende de lo que vaya a hacer con los valores sobrantes de array2.
Ahora, si desea almacenar un valor en las posiciones indefinidas de array1 para las cuales matched==true, entonces use un else en la condición.