Javascript 如何使用react js替换对象数组中已修改的对象
我有这样的对象结构Javascript 如何使用react js替换对象数组中已修改的对象,javascript,arrays,reactjs,object,ecmascript-6,Javascript,Arrays,Reactjs,Object,Ecmascript 6,我有这样的对象结构 [{ "id":"8661c8c96df94ac78283360e0d1c86bd", "modifiedObject":{....}, "originalObject":{...} }, { "id":"1525drd616dr17d78283360e0d1c86bd", "modifiedObject":null, "ori
[{
"id":"8661c8c96df94ac78283360e0d1c86bd",
"modifiedObject":{....},
"originalObject":{...}
},
{
"id":"1525drd616dr17d78283360e0d1c86bd",
"modifiedObject":null,
"originalObject":{...}
},
{
"id":"6767srsr14542525276767cbd246464",
"modifiedObject":{....},
"originalObject":null
}]
我正在查找一个id为的对象,并获取内部对象(如果存在修改过的对象,如果不是原始对象),然后使用下面的代码修改数据
const originalCopyObject = projObjs.find(s => s.id === projectObjectId);
const targetCopyObject = originalCopyObject.modifiedObject || originalCopyObject.originalObject; // here in this case it always be one either modified or original object
const targetMutatedCopyObject = cloneDeep(targetCopyObject);
if (!targetMutatedCopyObject?.glazingOrGasMaterials.length) {
targetMutatedCopyObject.glazingOrGasMaterials = [
...targetMutatedCopyObject.glazingGasMaterials,
...targetMutatedCopyObject.glazingSimpleMaterials,
];
}
targetMutatedCopyObject.opaqueConstructions.forEach(transformConstructions);
现在targetMutatedCopyObject
有一个modifiedObject或originalObject,如何在projObjs
中替换这个targetMutatedCopyObject对象
任何人都可以告诉我如何替换projObjs
对象数组中的tragetMutatedCopyObject
非常感谢
更新代码:
projObjs.map(projObj => {
if (projObj.id === projectObjectId) {
const targetCopyObject = projObj.modifiedObject || projObj.originalObject;
const mutatedCopyObject = transformFormStateToMutationObject(targetCopyObject);
if (projObj.modifiedObject) {
return {
...projObj,
modifiedObject: mutatedCopyObject
};
}
if (projObj.originalObject) {
return {
...projObj,
originalObject: mutatedCopyObject
};
}
return projObj;
}
return projObj;
});
}`
通常,您会将旧对象复制或映射到新对象引用。如果id与当前映射的元素匹配,则返回具有更新/修改属性的新对象,否则返回当前元素
projObjs.map((projObj) => {
if (projObj.id === projectObjectId) {
const targetCopyObject = projObj.modifiedObject || projObj.originalObject;
const targetMutatedCopyObject = cloneDeep(targetCopyObject);
if (!targetMutatedCopyObject?.glazingOrGasMaterials.length) {
targetMutatedCopyObject.glazingOrGasMaterials = [
...targetMutatedCopyObject.glazingGasMaterials,
...targetMutatedCopyObject.glazingSimpleMaterials
];
}
targetMutatedCopyObject.opaqueConstructions.forEach(transformConstructions);
return {
...projObj,
modifiedObject: targetCopyObject
};
}
return projObj;
});
编辑以将更新的对象返回到其原始对象关键帧中
将对象更新逻辑分解为实用程序函数,并在modifiedObject
和originalObject
值上应用一些分支逻辑,以便将更新的对象返回到相应的键
projObjs.map((projObj) => {
if (projObj.id === projectObjectId) {
const updateObject = (targetCopyObject) => {
const targetMutatedCopyObject = cloneDeep(targetCopyObject);
if (!targetMutatedCopyObject?.glazingOrGasMaterials.length) {
targetMutatedCopyObject.glazingOrGasMaterials = [
...targetMutatedCopyObject.glazingGasMaterials,
...targetMutatedCopyObject.glazingSimpleMaterials
];
}
targetMutatedCopyObject.opaqueConstructions.forEach(
transformConstructions
);
return targetMutatedCopyObject;
};
if (projObj.modifiedObject) {
return {
...projObj,
modifiedObject: updateObject(projObj.modifiedObject)
};
}
if (projObj.originalObject) {
return {
...projObj,
originalObject: updateObject(projObj.originalObject)
};
}
return projObj;
}
return projObj;
});
注意:确保从
projObjs.map
捕获返回的结果,以更新任何父对象。这将是新更新的数组。通常,您会将旧对象复制或映射到新对象引用。如果id与当前映射的元素匹配,则返回具有更新/修改属性的新对象,否则返回当前元素
projObjs.map((projObj) => {
if (projObj.id === projectObjectId) {
const targetCopyObject = projObj.modifiedObject || projObj.originalObject;
const targetMutatedCopyObject = cloneDeep(targetCopyObject);
if (!targetMutatedCopyObject?.glazingOrGasMaterials.length) {
targetMutatedCopyObject.glazingOrGasMaterials = [
...targetMutatedCopyObject.glazingGasMaterials,
...targetMutatedCopyObject.glazingSimpleMaterials
];
}
targetMutatedCopyObject.opaqueConstructions.forEach(transformConstructions);
return {
...projObj,
modifiedObject: targetCopyObject
};
}
return projObj;
});
编辑以将更新的对象返回到其原始对象关键帧中
将对象更新逻辑分解为实用程序函数,并在modifiedObject
和originalObject
值上应用一些分支逻辑,以便将更新的对象返回到相应的键
projObjs.map((projObj) => {
if (projObj.id === projectObjectId) {
const updateObject = (targetCopyObject) => {
const targetMutatedCopyObject = cloneDeep(targetCopyObject);
if (!targetMutatedCopyObject?.glazingOrGasMaterials.length) {
targetMutatedCopyObject.glazingOrGasMaterials = [
...targetMutatedCopyObject.glazingGasMaterials,
...targetMutatedCopyObject.glazingSimpleMaterials
];
}
targetMutatedCopyObject.opaqueConstructions.forEach(
transformConstructions
);
return targetMutatedCopyObject;
};
if (projObj.modifiedObject) {
return {
...projObj,
modifiedObject: updateObject(projObj.modifiedObject)
};
}
if (projObj.originalObject) {
return {
...projObj,
originalObject: updateObject(projObj.originalObject)
};
}
return projObj;
}
return projObj;
});
注意:确保从
projObjs.map
捕获返回的结果,以更新任何父对象。这将是新的更新数组。感谢您的建议,如果projObj
仅具有原始对象而不是修改的对象,这是否有效object@EnigmaState如果我理解了这个后续问题,您会问如果原始数据对象只有原始对象
(即nomodifiedObject
),这是否有效财产?是的,我相信是这样的,因为projObj.modifiedbject | | projObj.originalObject
将抓取originalObject
,如果不存在modifiedbject
,应用逻辑,并将新修改的对象放在modifiedbject
属性中,保留originalObject
属性(假设您所有的逻辑都是正确的,并且没有变异,我认为这是因为您深度克隆了它)。哦,对不起,我需要替换确切的对象属性,如果projObj
只有originalObject
,那么我应该用修改后的originalObject属性替换现有属性(此处为案例targetMutatedCopyObject
)基于Id
且不想保留,我已更新comment@EnigmaState啊,因此,如果原始对象有一个modifiedObject
属性,并且该属性是您更新的,您希望它返回到modifiedObject
键,如果它只有originalObject
属性,您希望它返回到originalObject
key?这理解正确吗?感谢您的建议,如果projObj
只包含originalObject而不包含已修改的object@EnigmaState如果我理解了这个后续问题,您会问如果原始数据对象只有originalObject
(即编号修改对象
)属性?是的,我相信是这样的,因为projObj.modifiedbject | | projObj.originalObject
将抓取originalObject
如果不存在modifiedbject
则应用逻辑,并将新修改的对象放在modifiedbject
属性中,保留originalObject
属性(假设您所有的逻辑都是正确的,并且没有变异,我认为这是因为您深度克隆了它)。哦,对不起,我需要替换确切的对象属性,如果projObj
只有originalObject
,那么我应该用修改后的originalObject属性替换现有属性(此处为案例targetMutatedCopyObject
)基于Id
且不想保留,我已更新comment@EnigmaState啊,因此,如果原始对象有一个modifiedObject
属性,并且该属性是您更新的,您希望它返回到modifiedObject
键,如果它只有originalObject
属性,您希望它返回到originalObject
key?这种理解正确吗?