У меня есть объект Javascript с такой формой:
obj = {
'any': [
'someString',
{
'all': [
'another',
'andAnother',
{
'any': [
'user',
'id',
{
'all': [
'yes',
'no'
]
}
]
}
]
},
'test'
]
}
Объект, приведенный выше, является лишь примером. В основном все объекты должны иметь ключ "все" или "любой" и значение, которое представляет собой массив с только строками или объектом. Каждый массив может иметь только один объект. Объект может быть более или менее сложным, но должен следовать этой структуре.
Я хотел бы удалить элементы из сложного объекта на основе строки (или массива или массива массивов ->, что делает это проще всего), отформатированного следующим образом:
"[any][1][all][2][any][2][all][1]"
[any] [1] [all] [2] [any] [2] [all] [1] определяет местоположение строки "нет" внутри объекта и поэтому должно быть удалено. (obj[any][1][all][2][any][2][all][1] === 'no'
)
Я надеюсь это имеет смысл.
Это будет проще всего, если вход представляет собой массив ключей. Затем вы можете использовать reduce
для перебора по ним, каждый раз обращаясь к соответствующему ключу аккумулятора, передавая входной объект для начального значения. Как только вы перейдете к следующему последнему ключу, у вас есть массив - используйте splice
чтобы удалить элемент с нужным индексом:
const obj = {
'any': [
'someString',
{
'all': [
'another',
'andAnother',
{
'any': [
'user',
'id',
{
'all': [
'yes',
'no'
]
}
]
}
]
},
'test'
]
};
const removePath = ['any', 1, 'all', 2, 'any', 2, 'all', 1];
const indexToSplice = removePath.pop();
const arr = removePath.reduce((a, key) => a[key], obj);
arr.splice(indexToSplice, 1);
console.log(obj);
С помощью lodash вы можете легко сделать это через _.set
& _.without в одной строке следующим образом:
obj = { 'any': [ 'someString', { 'all': [ 'another', 'andAnother', { 'any': [ 'user', 'id', { 'all': [ 'yes', 'no' ] } ] } ] }, 'test' ] }
const path = ['any', 1, 'all', 2, 'any', 2, 'all']
const remove = (o, p, v) => _.set(o, p, _.without(_.get(o, p), v))
console.log(remove(obj, path, 'no')) // Will remove the 'no'
console.log(remove(obj, path, 'yes')) // Will remove the 'yes'
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
splice
противdelete
)