DEV Community

Yusuf Fazeri
Yusuf Fazeri

Posted on

JS Remove Optional Input

// Example data input const dataInput = { id: '11x', name: 'Fruits', items: [ { name: 'Manggo', types: ['busuk', 'bagus'], country: { name: 'nigeria' }, weight: 0, others: { name: 'other name', value: 0, }, }, ], genus: '', farmers: [], falsyValue: '', }; 
Enter fullscreen mode Exit fullscreen mode
// Expected output { id: "11x", name: "Fruits", items: [ { name: "Manggo", country: { name: "nigeria" }, others: { name: "other name" }, types: ["busuk", "bagus"] } ] } 
Enter fullscreen mode Exit fullscreen mode

Pertama, saya akan menggunakan package flat js untuk membuat outputnya jadi seperti ini.

// example flat output { id: "11x", name: "Fruits", items.0.name: "Manggo", items.0.types.0: "busuk", items.0.types.1: "bagus", items.0.country.name: "nigeria", items.0.others.name: "other name" // disini key-value lainnya agar tidak terlalu panjang ..... } 
Enter fullscreen mode Exit fullscreen mode

Pertimbangannya object tadi saya flat adalah agar tidak perlu membuat logika perulangan yang kompleks.

Untuk fungsinya nanti saya ingin menggunakannya seperti ini:

const removeOptionalFlat = removeOptionalInput(dataInput, [ 'bejo', 'items.*.weight', 'items.*.country', 'genus', 'items.*.others.value', 'falsyValue', 'farmers', ]); 
Enter fullscreen mode Exit fullscreen mode

Untuk fungsi removeOptionalFlat nya seperti ini:

function removeOptionalInput(dataObject, propertiesToRemove) { const newDataObject = { ...dataObject }; propertiesToRemove.forEach((property) => { const regexPattern = new RegExp(property.replace(/\*/g, '\\d+'), 'g'); Object.keys(newDataObject).forEach((key) => { if (regexPattern.test(key)) { if (typeof newDataObject[key] === 'object' && !Object.keys(newDataObject[key]).length) { delete newDataObject[key]; } if (!newDataObject[key]) { delete newDataObject[key]; } } }); }); return newDataObject; } 
Enter fullscreen mode Exit fullscreen mode

Lihat kode fungsi removeOptionalInput, saya menggunakan RegEx untuk membuat asosiasi string 'items.*.country' agar menghapus 'items.0.country', 'items.1.country', dan seterusnya.

Karena ini merupakan fungsi yang saya peruntukan untuk menghapus input form data yang sifatnya "opsional" maka saya perlu menghapus key-value object dari dataInput yang nilainya masuk dalam kategori falsy seperti string kosong, number 0, object/array kosong.

Fungsi yang tadi sudah dibuat hasilnya masih flat, kita perlu unflat dengan perintah unflatten(removeOptionalFlat). Untuk kode secara keseluruhannya kurang lebih seperti ini.

import { flatten, unflatten } from 'flat'; function removeOptionalInput(dataObject, propertiesToRemove) { const newDataObject = flatten({ ...dataObject }); propertiesToRemove.forEach((property) => { const regexPattern = new RegExp(property.replace(/\*/g, '\\d+'), 'g'); Object.keys(newDataObject).forEach((key) => { if (regexPattern.test(key)) { if (typeof newDataObject[key] === 'object' && !Object.keys(newDataObject[key]).length) { delete newDataObject[key]; } if (!newDataObject[key]) { delete newDataObject[key]; } } }); }); return unflatten(newDataObject); } const dataInput = { id: '11x', name: 'Fruits', items: [ { name: 'Manggo', types: ['busuk', 'bagus'], country: { name: 'nigeria' }, weight: 0, others: { name: 'other name', value: 0, }, }, ], genus: '', farmers: [], falsyValue: '', }; const removeOptionalFlat = removeOptionalInput(dataInput, [ 'bejo', 'items.*.weight', 'items.*.country', 'genus', 'items.*.others.value', 'falsyValue', 'farmers', ]); console.log(removeOptionalFlat, 'remove optional flat'); 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)