Tengo una serie de cadenas:
let arr = ["cap:1", "col:red", "cap:3", "cap:1", "col:blue", "screen:yes"]
y quiero tener una nueva matriz, con un elemento de cada categoría de subcadenas ( "cap", "col", "screen" ), el que tiene el índice más pequeño:
let newArray = ["cap:1","col:red","screen:yes"]
//"cap:1" from newArray is arr[0]
Intenté de esta manera:
const newArr = (arr) => { let c= [] let c = [...c, arr[0]] for(let i = 1; i<arr.length; i++){ for (let j=0; j<c.length; j++){ if(arr[i].split(":")[0] !== c[j].split(":")){ c = [...c, arr[i]] } } } return c } pero entra en bucle infinito y el resultado es algo como esto: ["cap:1","col:red","col:red","col:red","col:red","col:red","col:red","col:red"... ¿Podrían ayudarme por favor?
¡Gracias!
Su lógica no tiene forma de determinar que el prefijo del elemento actual no se encontró en newArr . Además, en la condición arr[i].split(":")[0] !== c[j].split(":") está comparando una cadena con una matriz, que siempre devuelve true - string != = matriz.
Es posible que haya tenido la intención de escribir arr[i].split(":")[0] !== c[j].split(":")[0] que aún no le daría el resultado deseado.
Puede eliminar el ciclo interno y comparar cada elemento con newArr usando c.every(el => !...) de la siguiente manera:
let arr = ["cap:1", "col:red", "cap:3", "cap:1", "col:blue", "screen:yes"]; const newArr = (arr) => { let c = [arr[0]]; for(let i = 1; i<arr.length; i++) { if( c.every(el => !arr[i].startsWith( el.split(':')[0] )) ) { c = [ ...c, arr[i] ]; } } return c; } console.log( newArr( arr ) );Podría tomar un Set con una matriz de primeras partes divididas.
Como resultado, obtenga una matriz del conjunto.
const array = ["cap:1", "col:red", "cap:3", "cap:1", "col:blue", "screen:yes"], types = [...new Set(array.map(s => s.split(':', 1)[0]))]; console.log(types);Continúa en un bucle infinito ya que hay dos bucles for anidados y uno de los bucles for anidados está iterando una matriz cada vez mayor. En su lugar, puede tener un objeto que actuará como referencia.
let arr = ["cap:1", "col:red", "cap:3", "cap:1", "col:blue", "screen:yes"]; const newArr = (arr) => { let c = []; const suffixObj = {}; for (let i = 0; i < arr.length; i++) { const getPrefix = arr[i].split(":")[0]; if (!suffixObj.hasOwnProperty(getPrefix)) { c.push(arr[i]); suffixObj[getPrefix] = true } } return c }; console.log(newArr(arr))