我有一个形状如下的Javascript对象:
obj = {
'any': [
'someString',
{
'all': [
'another',
'andAnother',
{
'any': [
'user',
'id',
{
'all': [
'yes',
'no'
]
}
]
}
]
},
'test'
]
}
上面的对象只是一个例子。基本上,所有对象都必须具有“ all”或“ any”的键以及一个仅包含字符串或对象的数组的值。每个数组只能有一个对象。对象可能或多或少复杂,但必须遵循此结构。
我想基于这样的格式的字符串(或最简单的数组)从复杂对象中删除元素:
"[any][1][all][2][any][2][all][1]"
[any] [1] [all] [2] [any] [2] [all] [1]定义字符串“ no”在对象中的位置,因此应将其删除。 (obj[any][1][all][2][any][2][all][1] === 'no'
)
我希望这是有道理的。
答案 0 :(得分:2)
如果输入是键数组,那么这将是最简单的。然后,您可以使用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);
答案 1 :(得分:0)
使用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>