Saya memiliki json berikut

[ 
 { 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" },
]

Dan saya ingin mengelompokkan seperti ini

[ 
 { 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" },
]

Yang berarti, saya ingin menelusuri array dan JIKA "periksa" benar biarkan saja, JIKA "periksa" adalah grup palsu dan buat sub.

Saya sudah mencoba memetakan array asli sesuai dengan centang, tetapi ini hanya mengelompokkan menjadi 2 subarray.

Ada ide bagaimana itu bisa dilakukan?

Terima kasih

1
user2062455 27 Oktober 2019, 21:48

3 jawaban

Jawaban Terbaik

Anda dapat melakukan ini menggunakan metode reduce dan jika pemeriksaan salah, Anda juga dapat memeriksa apakah elemen yang dimasukkan terakhir adalah objek dengan properti stack atau tidak.

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 Oktober 2019, 18:54

Anda harus mengulang array (arr) dan memeriksa apakah nilai cek salah. Jika demikian maka letakkan di dalam array kosong (chunckArr) dan dorong ke dalam array baru (newArr), dan jika nilai cek benar, cukup dorong objek ke 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 Oktober 2019, 19:19

Pendekatan yang sedikit berbeda dengan menggunakan elemen sebelumnya dari array untuk pemeriksaan.

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 Oktober 2019, 19:01