Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

222
Views
¿Cómo agregar elementos a un índice específico condicionalmente?

Tengo una matriz de objetos y quiero agregar un elemento a un índice específico cuando un determinado atributo cambia en comparación con el anterior.

Tenemos:

 const arr = [ { num: 1 }, { num: 1 }, { num: 1 }, { num: 3 }, { num: 3 }, { num: 4 }, { num: 5 }, ];

quiero que se convierta

 const arr = [ { separator:true } { num: 1 }, { num: 1 }, { num: 1 }, { separator:true } { num: 3 }, { num: 3 }, { separator:true } { num: 4 }, { separator:true } { num: 5 }, ];

Hice esto:

 const getIndexes = (myArr) => { let indexes = []; let previousValue = null; myArr.forEach((el, idx) => { if (el.num !== previousValue) { indexes.push(idx); previousValue = el.num; } }); return indexes; }; const insertSeparator = (arr) => { let result = arr; getIndexes(arr).forEach((position) => result.splice(position, 0, { separator: true })); return result };

y devuelve:

 [ { separator: true }, { num: 1 }, { num: 1 }, { separator: true }, { num: 1 }, { separator: true }, { separator: true }, { num: 3 }, { num: 3 }, { num: 4 }, { num: 5 } ]

Tal vez por el "nuevo" tamaño del arreglo, porque cada vez es más grande y cambia de dimensión.

¿Cuál crees que es la mejor manera de resolver esto?

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Propongo esta solución que consumiría solo una iteración con una reducción:

 const arr = [{ num: 1 }, { num: 1 }, { num: 1 }, { num: 3 }, { num: 3 }, { num: 4 }, { num: 5 }, ]; let prev_value = arr[0]; const result = arr.reduce((acc, val) => { const insert = (val.num !== prev_value.num) ? [{ separator: true }, val] : [val]; prev_value = val; return acc.concat(insert) }, [{ separator: true }, ]) console.log(result)

about 4 years ago · Juan Pablo Isaza Report

0

Ejecútelo a través .flatMap()

 const result = arr.flatMap((obj, idx, arr) => {...

.flatMap() es .map() y .flat() combinados, por lo que transforma el contenido de una copia de la matriz dada y elimina los corchetes [] . A continuación, devolvemos el primer objeto con un separador:

 if (idx == 0) { // returns are wrapped in brackets because they'll be removed before being returned return [{separator: true}, obj]; }

El siguiente paso es comparar el valor actual con el valor anterior:

 obj.num == arr[idx - 1].num ? // current value vs previous value [arr[idx - 1]] : // if they are the same value return previous value [{separator: true}, obj]; /* if they are not the same then return that separator and current */ 

 const arr = [ { num: 1 }, { num: 1 }, { num: 1 }, { num: 3 }, { num: 3 }, { num: 4 }, { num: 5 }, ]; const result = arr.flatMap((obj, idx, arr) => { if (idx == 0) { return [{ separator: true }, obj]; } return obj.num == arr[idx - 1].num ? [arr[idx - 1]] : [{ separator: true }, obj]; }); console.log(JSON.stringify(result, null, 2));

about 4 years ago · Juan Pablo Isaza Report

0

Debe haber otras formas de hacerlo también. Pero con una simple modificación de su código se puede hacer. Solo necesita realizar un seguimiento del desplazamiento con una nueva variable, incrementándola en el ciclo:

 const arr = [ { num: 1 }, { num: 1 }, { num: 1 }, { num: 3 }, { num: 3 }, { num: 4 }, { num: 5 }, ]; const getIndexes = (myArr) => { let indexes = []; let previousValue = null; myArr.forEach((el, idx) => { if (el.num !== previousValue) { indexes.push(idx); previousValue = el.num; } }); return indexes; }; const insertSeparator = (arr) => { let result = [...arr]; let offset = -1; getIndexes(arr).forEach((position) => { offset++; return result.splice(position+offset, 0, { separator: true }); }); return result }; console.log(insertSeparator(arr));

Nota: si desea comenzar con 0 , puede hacer el incremento en el .splice() : result.splice(position+(offset++),

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!