В основном вам нужно создать новый пустой массив knowledgeTypes
и использовать текущее состояние, чтобы найти, какой элемент состояния вам нужно изменить, используя Object.keys/map/filter
функции.
Вы бы использовать текущее состояние в переменной и изменять только эту переменную. Скорее всего, вы не будете связываться с реальным объектом состояния.
После того, как вы это сделаете, просто добавьте его в пустой массив. Затем вы можете установитьState () для нового массива на фактическое свойство состояния.
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
financialYear: "2019-20",
quarter: "Q1",
isCurrentQuarter: true,
knowledgeTypes: [
{
knowledgeTypeName: "Technology",
knowledgeItems: [
{
knowledgeItemName: "Java",
subItems: [
{
subItemId: "2",
subItemName: "Collections",
evaluation: {
self: {
ntnet: "Joe",
rating: 1,
isEditable: true
}
}
}
]
}
]
}
]
};
}
handleClick = e => {
const { knowledgeTypes } = this.state;
// transformation
const itemToChange = knowledgeTypes.map(item => {
if (item.knowledgeTypeName === "Technology") {
return item;
}
});
const currItems = itemToChange[0].knowledgeItems[0].subItems;
const subItem = currItems.map(item => {
if (item.subItemId === "2") {
return item;
}
});
const person = subItem[0].evaluation;
person.self.rating = 55; //change
const newKnowledgeTypes = [];
knowledgeTypes.map(item => {
if (item.knowledgeTypeName === "Technology") {
newKnowledgeTypes.push(itemToChange);
}
newKnowledgeTypes.push(item);
});
this.setState({
knowledgeTypes: newKnowledgeTypes
});
console.log(this.state);
};
render() {
return (
<div>
MyComponent
<button onClick={this.handleClick}>Hello</button>
</div>
);
}
}
Песочницу можно найти в https://codesandbox.io/s/musing-dew-8r2vk.
Примечание. : Желательно, чтобы вы не использовали вложенные объекты состояния, потому что объекты состояния являются чем-то более легким, так что они не влияют на производительность.