JS / lodash: мутировать и возвращать данные в одной строке кода - PullRequest
0 голосов
/ 13 октября 2019

Я не могу найти ответ на что-то такое простое. Как я могу изменить свойство объекта, например, логический флаг, а затем вернуть измененный объект в одной строке кода? Согласно моему примеру ниже, теперь требуется два. Все, что я читаю, говорит, что используйте карту против / forEach.

   toggleMenu(obj) {
        this.data = _.mapValues(this.data, function(v) {
             v.submenu = (v.submenu ^ (v.id === obj.id));
            return v;
        });
    }

ОБНОВЛЕНИЕ

Я должен был добавить, что возвращаемый объект должен / может отличаться, т.е. this.other = ... против this.data = ...

   toggleMenu(obj) {
        this.other = _.mapValues(this.data, function(v) {
             v.submenu = (v.submenu ^ (v.id === obj.id));
            return v;
        });
    }

Ответы [ 4 ]

1 голос
/ 13 октября 2019

Что-то вроде:

toggleMenu(obj) {
  this.data = _.mapValues(this.data, v => _.extend(v, { submenu: v.submenu ^ (v.id === obj.id)});
}
1 голос
/ 13 октября 2019

Код ниже обновляет код, но не mutate

Разница (в большинстве случаев) не имеет значения. Но если вам по определенным причинам придется обновить его на месте, вы можете использовать 2 строки для лучшей читаемости, чем любой хак

this.data = this.data.map(v => ({...v, submenu: (v.submenu ^ (v.id === obj.id)}));
1 голос
/ 13 октября 2019

Если вы хотите изменить существующий массив и не возвращать новый, вам не нужно переназначать значение. В этом случае лучше использовать _.forEach() (или _.forOwn(), поскольку это объект):

toggleMenu({ id }) {
  _.forEach(this.data, v => v.submenu ^= (v.id === id))
}
1 голос
/ 13 октября 2019

Поскольку вы все равно перезаписываете this.data, похоже, что вы сможете вернуть новый объект. Если это разрешено, используйте вместо этого распространение объекта и неявный возврат:

toggleMenu(obj) {
  this.data = _.mapValues(this.data, v => ({ ...v, submenu: v.submenu ^ (v.id === obj.id) }));
}

Можно также использовать Object.assign:

toggleMenu(obj) {
  this.data = _.mapValues(this.data, v => Object.assign(v, { submenu: v.submenu ^ (v.id === obj.id) }));
}
...