Javascript - Как изменить сложный объект на основе определенных координат - PullRequest
0 голосов
/ 29 октября 2018

У меня есть объект Javascript с такой формой:

      obj = {
            'any': [
                'someString',
                {
                    'all': [
                        'another',
                        'andAnother',
                        {
                            'any': [
                                'user',
                                'id',
                                {
                                    'all': [
                                        'yes',
                                        'no'
                                    ]
                                }
                            ]
                        }
                    ]
                },
                'test'
            ]
        }

Приведенный выше объект является лишь примером.В основном все объекты должны иметь ключ 'all' или 'any' и значение, представляющее собой массив, содержащий только строки или объект.Каждый массив может иметь только один объект.Объект может быть более или менее сложным, но должен следовать этой структуре.

Я хотел бы удалить элементы из сложного объекта на основе строки (или массива или массива массивов -> что бы это ни было проще), отформатированной так:

"[any][1][all][2][any][2][all][1]"

[любой] [1] [all] [2] [any] [2] [all] [1] определяет расположение строки «no» внутри объекта и поэтому должно быть удалено.(obj[any][1][all][2][any][2][all][1] === 'no')

Надеюсь, это имеет смысл.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

С помощью lodash вы можете легко сделать это через _.set & _. Без в одной строке, например:

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>
0 голосов
/ 29 октября 2018

Это будет намного проще, если входные данные представляют собой массив ключей. Затем вы можете использовать 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);
...