对于以下代码,参数是js对象,其结构初始化如下:
statePiece = {
field_name: { disabled: false, exampleValue: "arbitrary" },
field_name2: {
/* ... */
},
field_nameN: {
/* ... */
}
};
userField = "field_name_string";
sesarValues = {
format: "one2one",
selectedField: "latitude",
disabledSelf: true,
addField: 0
};
此函数正常工作,并在第一次修改特定的statePiece
时将修改后的returnTemp
返回为statePiece.field_name
export let setUserField = (statePiece, userField, sesarValues) => {
console.log("set user field", userField, "set mappval", sesarValues);
var temp = { ...statePiece }; //(this.state.fields[each].mappedTo != null) ? (this.state.fields[userField].mappedTo) : [];
var XUnit = statePiece[userField];
if (typeof userField != "string") {
console.log("not string");
for (var each of userField) {
if (sesarValues) {
temp[each].mappedTo = sesarValues.selectedField;
temp[each].disabled = true;
} else {
temp[each].disabled = !temp[each].disabled;
delete temp[each].mappedTo;
}
}
} else {
//is string
console.log("is string");
console.log(XUnit);
if (sesarValues) {
if (XUnit.disabled === true) XUnit.disabled = false;
console.log("1");
console.log(XUnit);
XUnit.disabled = true;
console.log(XUnit);
XUnit.mappedTo = sesarValues.selectedField;
} else {
console.log("2");
temp[userField].disabled = !temp[userField].disabled;
delete temp[userField].mappedTo;
}
}
let returnTemp = { ...temp, [userField]: XUnit };
console.log("set UF debug ", returnTemp);
console.log(returnTemp["FACILITY_CODE"]);
return returnTemp;
};
但是在此之后,更改statePiece.userField.mappedTo
值将无法更改对象属性。或者至少永久更改它。当我控制台记录returnTemp
变量时,我看到该条目丢失了它的mappedTo
条目(应该发生),而没有被新的userField
取代。
但是,当我console.log(returnTemp[userField])
时,它会显示带有预期的mappedTo
键的输入值:值对。
不知道这是怎么回事。
答案 0 :(得分:0)
根据userField
的用法,我可以得出它可能是Array
或String
。
但是您对以下表达式做了一些奇怪的事情:
var XUnit = statePiece[userField];
鉴于userField
是String
,上面的表达式很好。
但是,如果是数组,则XUnit
将是undefined
。
如果在下一行中userField
是Array
的情况下也进行相同的操作,则意味着您将userField.toString()
设置为映射到undefined
的键。
let returnTemp = { ...temp, [userField]: XUnit };
我要分配XUnit
,条件是检查userField
是String
并返回temp
。
else {
//is string
var XUnit = statePiece[userField];
//...
}
return temp;