Неизменность против ручной проверки производительности
В нативном приложении с использованием приставки я бы хотел обновить состояние приложения с помощью immutable-js. я использую mergeDeep
обновить состояние. Есть одна проблема: когда был удален элемент из массива. Таким образом, я обнаружил этот случай, преобразовав новые данные в неизменяемые, а затем сравнив размеры. Это отлично работает:
function updateSettings(state, action) {
const mutablePath = [].concat(action.path);
const lastPathKey = mutablePath.pop();
let nextState;
let newArr;
if (isInt(lastPathKey)) {
// An array has been changed
if (Immutable.fromJS(action.data).getIn(mutablePath).size < state.getIn(mutablePath).size) {
// The element at lastPathKey has been removed
newArr = state.getIn(mutablePath).remove(lastPathKey);
nextState = state.setIn(mutablePath, newArr);
}
}
if (!nextState) {
nextState = state.mergeDeep(action.data);
}
return nextState;
}
Action.data - это всегда полный путь к объекту (как я использую tcomb-form-native): если элемент был изменен, путь к действию выглядит следующим образом:
action.path = ["testStruct", "deepArray", 0, "objectArr", "valDAOA1"]
action.data = {
"isShowHelp": false,
"testStruct": {
"deepArray: [
{
"objectArr": {
"valDAOA1": 10
}
},
{
"objectArr": {
"valDAOA1": 20
}
}
]
}
}
Если элемент массива был удален:
action.path = ["testStruct", "deepArray", 1]
action.data = {
"isShowHelp": false,
"testStruct": {
"deepArray: [
{
"objectArr": {
"valDAOA1": 10
}
}
]
}
}
Мне интересно, было бы более эффективно получить размер массива с помощью ручного метода, подобного предложенному в /questions/35436038/dostup-k-vlozhennyim-obektam-javascript-s-pomoschyu-strokovogo-klyucha/35436059#35436059 и есть ли другие случаи, которые следует принимать во внимание.