Tengo el siguiente json

[ 
 { check:false, value:"some value" },
 { check:true,  value:"some value" },
 { check:false, value:"some value" },
 { check:false, value:"some value" },
 { check:false, value:"some value" },
 { check:true,  value:"some value" },
 { check:true,  value:"some value" },
]

Y quiero agrupar así

[ 
 { stack: [
           { check:false, value:"some value" }
          ]
 },
 { check:true,  value:"some value" },
 { stack: [
           { check:false, value:"some value" },
           { check:false, value:"some value" },
           { check:false, value:"some value" },
          ]
 },
 { check:true,  value:"some value" },
 { check:true,  value:"some value" },
]

Lo que significa que me gustaría ir a través de la matriz y SI "verificar" es verdadero, dejarlo como está, SI "verificar" es un grupo falso y crear un sub.

Intenté mapear la matriz original de acuerdo con la verificación, pero esto solo se agrupa en 2 submatrices.

Alguna idea de cómo se puede hacer eso?

Gracias

0
user2062455 27 oct. 2019 a las 21:48

3 respuestas

La mejor respuesta

Puede hacerlo utilizando el método reduce y si la verificación es falsa, también puede verificar si el último elemento insertado es un objeto con propiedad de pila o no.

const data = [  { check:false, value:"some value" }, { check:true,  value:"some value" }, { check:false, value:"some value" }, { check:false, value:"some value" }, { check:false, value:"some value" }, { check:true,  value:"some value" }, { check:true,  value:"some value" },]

const result = data.reduce((r, e) => {
  const last = r[r.length - 1];
  if (e.check) r.push(e);
  else {
    if (!last || !('stack' in last)) r.push({ stack: [e]})
    else last.stack.push(e); 
  }
  return r;
}, []);

console.log(result)
3
Nenad Vracar 27 oct. 2019 a las 18:54

Un enfoque ligeramente diferente mediante el uso del elemento anterior de la matriz para la verificación.

var data = [{ check: false, value: "some value" }, { check: true, value: "some value" }, { check: false, value: "some value" }, { check: false, value: "some value" }, { check: false, value: "some value" }, { check: true, value: "some value" }, { check: true, value: "some value" }],
    grouped = data.reduce((r, o, i, { [i - 1]: p }) => {
        if (o.check) {
            r.push(o);
            return r;
        }
        if (!p || p.check) r.push({ stack: [o] });
        else r[r.length - 1].stack.push(o);
        return r;
    }, []);

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Nina Scholz 27 oct. 2019 a las 19:01

Debe recorrer la matriz (arr) y verificar si el valor de verificación es falso. Si es así, colóquelo dentro de una matriz vacía (chunckArr) e introdúzcalo en la nueva matriz (newArr), y si el valor de check es verdadero, simplemente inserte el objeto en newArr.

const arr = [
  { check:false, value:"some value" },
  { check:true,  value:"some value" },
  { check:false, value:"some value" },
  { check:false, value:"some value" },
  { check:false, value:"some value" },
  { check:true,  value:"some value" },
  { check:true,  value:"some value" },
];
let newArr = [];
for(const elem of arr) {
  let chunckArr = [];
  
  if (!elem.check) {
	chunckArr[0] = elem;
	newArr.push(chunckArr);
  } else {
    newArr.push(elem);
  }
};

console.log(newArr);
0
Islam Sayed 27 oct. 2019 a las 19:19