#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 */