Tengo una matriz de objetos y, de acuerdo con una propiedad insertada en uno de ellos, me gustaría marcar o seleccionar todos los objetos anteriores a ese contenedor de objetos de la propiedad específica.
Mi matriz es de esta manera:
const arrX= [ { status: '1' }, { status: '2'}, { status: '3', imHere: true }, { status: '4' }, ]; Luego, debido a la propiedad imHere en arrX[2], las posiciones arrX[0] y arrX[1] deben modificarse.
Mi resultado esperado sería:
const arrX= [ { status: '1',wasHere:true }, { status: '2',wasHere:true}, { status: '3', imHere: true }, { status: '4' }, ]; Sé que el método del map sería bastante útil en este caso, pero no puedo encontrar la manera de verificar desde el índice del objeto que contiene imHere hacia atrás las posiciones anteriores
Un enfoque es usar .findIndex() y .map() :
const arrX= [{ status: '1' }, { status: '2'}, { status: '3', imHere: true }, { status: '4'}]; const imHereIndex = arrX.findIndex(({imHere}) => imHere === true); const result = arrX.map((val, index) => index < imHereIndex ? { ...val, wasHere: true } : val ); console.log(result);Incluso si la respuesta de @Kinglish funciona de maravilla, quiero compartir otra forma de lograr su objetivo. Este camino es seguramente más largo que los Kinglish, nunca menos es una buena alternativa.
{ status: '4' }, ]; function findProperty(arr) { const hasProperty = arr.findIndex(el => Object.keys(el).includes('imHere')) const addNewProperty = arr.map((el,i) => (i < hasProperty) ? {...el, wasHere: true} : el) return addNewProperty } const updatedArray = findProperty(arrX) console.log(updatedArray)Aquí hay un método para usar Array#reduce y un booleano para rastrear si hemos encontrado inHere
const arrX = [ {status: '1'}, {status: '2'}, {status: '3',imHere: true}, {status: '4'}, ]; let found = false, updated = arrX.reduce((b, a) => { found = found || (a.hasOwnProperty('imHere') && a.imHere === true) if (!found) a.wasHere = true; return b.concat(a); }, []) console.log(updated)