Javascript-如何根据定义的坐标修改复杂对象

时间:2018-10-28 23:53:32

标签: javascript lodash

我有一个形状如下的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'

我希望这是有道理的。

2 个答案:

答案 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>