использование es6 redu () для манипулирования объектом с использованием другого объекта - PullRequest
0 голосов
/ 05 октября 2018

У меня есть объект состояния как:

this.state = {
    letterType: {},
    letterTag: {},
    departmentName: {},
    assignedOfficer: {}
}

, и у меня есть другой объект sortFilters как:

sortFilters = {
    letterType: {
        0: "letterType1",
        1: "letterType2"
    },
    letterTag: {},
    departmentName: {
        0: "dept1"
    },
    assignedOfficer: {}
}

Теперь мне нужно создать объект newState (возможно,используя es6 reduce()), который будет создан на основе sortFilters объекта, такого как:

this.newState = {
    letterType: {
        letterType1: true,
        letterType2: true
    },
    letterTag: {},
    departmentName: {
        dept1: true
    },
    assignedOfficer: {}
}

Я думаю, что это возможно при использовании es6 redu (), но я не могу заставить его работать.

Ответы [ 3 ]

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

Существуют и другие методы для достижения того же, так как reduce используется над массивами.Но если использование reduce является практикой, то да, это также возможно, грубый способ может быть похож на следующий, где мы можем использовать reduce над ключами объектов, которые являются массивом.

let state = {letterType: {},letterTag: {},departmentName: {},assignedOfficer: {}}

let sortFilters = {letterType: {0: "letterType1",1: "letterType2"},letterTag: {},departmentName: {0: "dept1"},assignedOfficer: {}}

let newState = Object.keys(state).reduce(function(prev, current) {
  let val = sortFilters[current]
  if (!val) {
    prev[current] = state[current]
  } else {
    prev[current] = Object.keys(val).reduce(function (p, c) {
      p[val[c]] = true
      return p
    }, {})
  }
  return prev
}, {})

console.log(newState)

Для получения более подробной информации о уменьшение и Object.keys , пожалуйста, обратитесь к документации Mozilla Developer Network.

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

Не уверен, что означает "состояние" или this.state в этом контексте ... Реагировать?В любом случае, похоже, что вы просто хотите распаковать определенные свойства и манипулировать ими.В этом случае может помочь деструктурирующее назначение.См. Этот раздел статьи на Разрушение вложенных объектов и этот раздел на Развертывание вложенных объектов и массивов


Демо

let sortFilters = {
    letterType: {
        0: "letterType1",
        1: "letterType2"
    },
    letterTag: {},
    departmentName: {
        0: "dept1"
    },
    assignedOfficer: {}
}

// Making a copy of sortFilters
let final = JSON.parse(JSON.stringify(sortFilters));

// Desruturing final, assigning variables and values
let {
   letterType: {
       letterType1: letterType1 = true,
       letterType2: letterType2 = true
   },
   letterTag: {},
    departmentName: {
        dept1: dept1 = true
    },
    assignedOfficer: {}
} = final;

console.log(letterType1);
console.log(letterType2);
console.log(dept1);
0 голосов
/ 05 октября 2018

Как описано, ваша проблема - это вариант использования для Object.assign, поскольку вы просто хотите скопировать содержимое четырех объектов (на sortFilters) в ваш объект состояния.Вы можете сделать это вручную:

Object.assign(this.newState.letterType,      sortFilters.letterType);
Object.assign(this.newState.letterTag,       sortFilters.letterTag);
Object.assign(this.newState.departmentName,  sortFilters.departmentName);
Object.assign(this.newState.assignedOfficer, sortFilters.assignedOfficer);

... или в цикле:

for (const name of Object.keys(sortFilters)) {
    Object.assign(this.newState[name], sortFilters[name]);
}

объединяет записи из объектов sortFiltersс теми, что в this.newState.Если вы хотите вместо них заменить , вы будете использовать назначение (и, вероятно, поверхностную копию, но это зависит от того, как sortFilters будет использовано позже):

this.newState.letterType      = Object.assign({}, sortFilters.letterType);
this.newState.letterTag       = Object.assign({}, sortFilters.letterTag);
this.newState.departmentName  = Object.assign({}, sortFilters.departmentName);
this.newState.assignedOfficer = Object.assign({}, sortFilters.assignedOfficer);

или

for (const name of Object.keys(sortFilters)) {
    this.newState[name] = Object.assign({}, sortFilters[name]);
}

Обратите внимание, что Object.assign делает мелкую копию;если какой-либо из этих объектов является вложенным, вам понадобится что-то еще.

Начиная с ES2018, вы можете использовать разброс свойств при создании новых объектов вместо Object.assign:

for (const name of Object.keys(sortFilters)) {
    this.newState[name] = {...sortFilters[name]};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...