Javascript - Как изменить сложный объект на основе определенных координат

1

У меня есть объект 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')

Я надеюсь это имеет смысл.

  • 0
    Всегда ли последний элемент удаляется внутри массива? (если нет, это сделает код немного более запутанным из-за splice против delete )
  • 0
    Да - это всегда в массиве - спасибо за взгляд.
Теги:
lodash

2 ответа

3
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню