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));