page ejemplos bootstrap attribute javascript object

ejemplos - Eliminar de un objeto usando JavaScript



title html css (5)

Tengo un objeto como se muestra:

const arr = [ { name: ''FolderA'', child: [ { name: ''FolderB'', child: [ { name: ''FolderC0'', child: [], }, { name: ''FolderC1'', child: [], }, ], }, ], }, { name: ''FolderM'', child: [], }, ];

Y tengo camino como cuerda:

var path = "0-0-1".

Tengo que borrar el objeto:

{ name: ''FolderC1'', child: [], },

Lo cual puedo hacer haciendo,

arr[0].child[0].splice(1, 1);

Pero quiero hacerlo dinámicamente. Dado que la cadena de ruta puede ser cualquier cosa, quiero lo anterior ''.'' La definición de operador y empalme se creará dinámicamente para empalmar en un lugar determinado.


Podría escribir una función recursiva que recorre la jerarquía hasta que la ruta esté disponible. A continuación se muestra un fragmento muy mínimo.

const arr = [ { name: ''FolderA'', child: [ { name: ''FolderB'', child: [ { name: ''FolderC0'', child: [], }, { name: ''FolderC1'', child: [], }, ], }, ], }, { name: ''FolderM'', child: [], }, ]; let ar_path = "0-0-1"; function deleteRecursive(arr, path) { if(Array.isArray(arr) && path.length > 0){ const index = Number(path.shift()); if (path.length > 0) deleteRecursive(arr[index].child, path) else arr.slice(index, 1); } else { console.log(''invalid''); } } deleteRecursive(arr, ar_path.split(''-'')) console.log(arr);


Podría reducir los índices guardando el último índice y devolviendo los hijos del índice real. Posterior empalme con el último índice.

function deepSplice(array, path) { var indices = path.split(''-''), last = indices.pop(); indices .reduce((a, i) => a[i].child, array) .splice(last, 1); } const array = [{ name: ''FolderA'', child: [{ name: ''FolderB'', child: [{ name: ''FolderC0'', child: [] }, { name: ''FolderC1'', child: [] }] }] }, { name: ''FolderM'', child: [] }]; deepSplice(array, "0-0-1"); console.log(array);

.as-console-wrapper { max-height: 100% !important; top: 0; }


Podrías dividir tu path y usar las partes, así:

let path = ''0-0-1''; let parts = path.split(''-''); // Call your splice using your parts (unsure if your ''1'' is the index, or deleteCount). // If parts[2] is the index arr[parts[0]].child[parts[1]].splice(parts[2], 1); // If parts[2] is the deleteCount: arr[parts[0]].child[parts[1]].splice(1, parts[2]);


Si la ruta siempre va a estar compuesta por 3 (o menos) índices, puede hacerlo fácilmente de la siguiente manera:

function deleteByPath(arr, path) { const index = path.split(''-'').map((x) => +x); if ( index.length < 1) { return null; } else if ( 1 === index.length ) { return arr.splice(index[0], 1); } else if ( 2 === index.length ) { return arr[index[0]].child.splice(index[1], 1); } else { return arr[index[0]].child[index[1]].child.splice(index[2], 1); } } const arr = [ { name: ''FolderA'', child: [ { name: ''FolderB'', child: [ { name: ''FolderC0'', child: [], }, { name: ''FolderC1'', child: [], }, ], }, ], }, { name: ''FolderM'', child: [], }, ]; console.log(deleteByPath(arr, "0-0-1")); console.log(deleteByPath(arr, "0-1")); console.log(deleteByPath(arr, "0"));

Si la ruta se compone de quizás menos de 3 partes, puede ajustar la función deleteByPath para manejar los casos según la cantidad de partes.

Si la ruta va a ser arbitraria y puede tener cualquier longitud, puede ajustar la función deleteByPath para que sea recursiva como la siguiente:

function deleteByIndexRecursive(arr, index, current) { return current+1 < index.length ? deleteByIndexRecursive(arr.child[index[current]], current+1) : arr.child.splice(index[current], 1); } function deleteByPath(arr, path) { const index = path.split(''-'').map((x) => +x); if ( 1>index.length) { return null; } else if ( 1===index.length) { return arr.splice(index[0], 1); } else { return deleteByIndexRecursive(arr[index[0]], index, 1); } }


//Variable setup: const arr = [ { name: ''FolderA'', child: [ { name: ''FolderB'', child: [ { name: ''FolderC0'', child: [], }, { name: ''FolderC1'', child: [], }, ], }, ], }, { name: ''FolderM'', child: [], }, ]; const path = "0-0-1"; //Break the path into pieces to iterate through: const pathArray = path.split("-"); //Javascript assignments are by reference, so arrayToManage is going to be an internal piece within the original array let arrayToManage = arr; //We are going to iterate through the children of the array till we get above where we want to remove while(pathArray.length > 1){ const key = parseInt(pathArray.shift()); arrayToManage = arrayToManage[key].child; } //Get the last position of the last array, where we want to remove the item const key = parseInt(pathArray.shift()); arrayToManage.splice(key,1); //And because it''s all by reference, changed we made to arrayToManage were actually made on the arr object console.log("end result:", JSON.stringify(arr));