Javascript — удаление дочернего объекта из родительского объекта на основе пути к дочернему объекту

#javascript #reactjs #ecmascript-6

#javascript #reactjs #ecmascript-6

Вопрос:

У меня есть путь к дочернему объекту в родительском объекте. Этот путь представляет собой комбинацию массивов и объектов const path = ['one', 'two', '0', 'three', '2']; , а родительский объект будет

 const root = {
    'one' : {
        'two': [
            {
                'three': [
                    {}, 
                    {}, 
                    {
                    'deleterObject': 'yes'
                    }
               ]
            },
          [], []
        ],
        c: [], 
        d: []
    }
}
  

после выполнения этого выполнения конечный результат должен выглядеть следующим образом,

 const root = {
    'one' : {
        'two': [
            {
                'three': [
                    {}, 
                    {}
               ]
            },
          [], []
        ],
        c: [], 
        d: []
    }
}
  

функция, которую я написал,

 const deleteObject = (root, path) => {
    let concated = '';
    for(let child in pathArray) {
        if(child > 0) concated = concated.concat(`[${pathArray[child]}]`)
        else concated = `[${pathArray[child]}]`
    }
    delete concated;
    return root
}
  

Но он возвращает ошибку, пожалуйста, предложите какую-нибудь функцию для этого.

Комментарии:

1. В чем ошибка?

2. Он продолжает переходить в цикл, застревая

Ответ №1:

Вы можете получить последнее свойство из своего path массива (т.Е.: 2), а затем использовать .reduce() для перехода по каждому свойству path in root . В конце концов, вы дойдете до объекта, из которого хотите удалить. Вы можете проверить, является ли это массивом, используя Array.isArray() , а затем .splice() удалить элемент. Если это не массив, вы можете использовать delete для удаления свойства из вашего объекта:

 const path = ['one', 'two', '0', 'three', '2'];
const root = { 'one': { 'two': [{ 'three': [{}, {}, { 'deleterObject': 'yes' } ] }, [], [] ], c: [], d: [] } }

const deleteObject = (root, [...path]) => {
  const propToDel = path.pop();
  const toDeleteFrom = path.reduce((obj, p) => obj[p], root);
  if(Array.isArray(toDeleteFrom))
    toDeleteFrom.splice(propToDel, 1);
  else
    delete toDeleteFrom[propToDel];
}

deleteObject(root, path);
console.log(root);  
 .as-console-wrapper { max-height: 100% !important;} /* ignore */