Saya memiliki array objek dengan struktur ini

mockData: [{
    'ONE': [{
      id: 11,
      ...
    }, {
      id: 4,
      ...
    }]
  },
  {
    'TWO': [{
      id: 11,
      ...
    }]
  }
]

Saya ingin memfilter item berdasarkan id (misalnya dengan id === 11) dan dengan kunci Object. Misalnya saya ingin menghapus

'ONE': [{
      id: 11,
      ...
    }

Tapi tinggalkan

 {
    'TWO': [{
      id: 11,
      ...
    }]
  }

Saya menemukan filter itu hanya dengan id

mockData.map(item => {
  return Object.values(item).map(inner => {
    return inner.filter(i => i.id !== id)
  });
})

Ini berfungsi tetapi menghapus kunci objek ('SATU', 'DUA' dll.) Dan mengembalikan data seperti ini

[[{id:3, ...}]],
[[]]

Dari pada

'TWO': []

Semua bantuan untuk menyesuaikan fungsi saya agar berfungsi dengan baik akan sangat dihargai.

Juga, saya melakukannya di peredam Redux, jadi saya tidak bisa mengubah array awal.

-1
Person 10 Januari 2020, 15:18

2 jawaban

Jawaban Terbaik

Anda dapat mencoba menggunakan metode Array.reduce.

Contoh:

const data = [
  {
    ONE: [{ id: 11 }, { id: 12 }, { id: 13 }],
    TWO: [{ id: 11 }, { id: 12 }, { id: 13 }]
  }
];

const filtered = data.map(item => {
  return Object.keys(item).reduce((prev, key) => {
    prev[key] = item[key].filter(({ id }) => id !== 11);
    return prev;
  }, {});
});
console.log(filtered)
2
Calvin Nunes 10 Januari 2020, 12:30

Anda perlu memisahkan bagian-bagian dan mendapatkan larik paling dalam bersama dengan kuncinya dan kemudian menambahkan hasil ini ke larik luar.

const
    filter = (array, id) => array.reduce((r, o) => {
        var hasContent,
            content = Object.assign({}, ...Object.entries(o).map(([k, v]) => {
                v = v.filter(o => o.id !== id);
                if (v.length) {
                    hasContent = true;
                    return { [k]: v };
                }
            }));
        if (hasContent) r.push(content);
        return r;
    }, []);

var data = { mockData: [{ ONE: [{ id: 11 }, { id: 4 }] }, { TWO: [{ id: 11 }] }] }

console.log(filter(data.mockData, 11));
.as-console-wrapper { max-height: 100% !important; top: 0; }
0
Nina Scholz 10 Januari 2020, 12:30