问题描述
我有以下代码,这是我之前的一个问题的答案,但我不想把 question 弄乱,我想重申我实际在寻找什么,因为我似乎无法掌握它。
我想要的预期输出现在只是一个具有更改值和 id 的对象。但是,这需要更改,因此它不会像现在的代码那样在每次实例更改时都会堆积,并且会控制台另一个对象。我只是希望最新的比较得到安慰而忽略上一个。希望这是有道理的。如果需要,我可以进一步解释。
当我说堆叠时,我的意思是,它在下一次状态改变时控制两个项目,然后是三个,依此类推,第四个。我只想要最新的更改,以便我可以运行突变并更新我的数据库
状态改变后的期望结果#1
import eyed3
import urllib.request
audiofile = eyed3.load("D:\\tmp\\tmp_mp3\\track_example.mp3")
audiofile.initTag(version=(2,3,0)) # version is important
# Other data for demonstration purpose only (from docs)
audiofile.tag.artist = "Token Entry"
audiofile.tag.album = "Free For All Comp LP"
audiofile.tag.album_artist = "VarIoUs Artists"
audiofile.tag.title = "The Edge"
# Read image from local file (for demonstration and future readers)
with open("D:\\tmp\\tmp_covers\\cover_2021-03-13.jpg","rb") as image_file:
imagedata = image_file.read()
audiofile.tag.images.set(3,imagedata,"image/jpeg",u"cover")
audiofile.tag.save()
# Get image from the Internet
response = urllib.request.urlopen("https://example.com/your-picture-here.jpg")
imagedata = response.read()
audiofile.tag.images.set(3,u"cover")
audiofile.tag.save()
状态改变后的预期结果#2
{col0:"snappy",col10:"292959180223939085"}
{col0:"some state change",col10:"292959180223939085"}
const oldState = [{
"col0": "Decor","col1": "2021-03-31","col2": "okok","col3": true,"col4": 7,"col5": 5,"col6": "Curation","col7": "fsaf","col8": "https://res.cloudinary.com/kitson-co/image/upload/v1615646495/catalog/sse5zxtklsj3ib730zjy.png","col9": 4,"col10": "292959180223939085"
},{
"col0": "Decor","col2": "fdsafd","col4": 3,"col5": 3,"col7": "fdsfsa","col8": "https://res.cloudinary.com/kitson-co/image/upload/v1615657360/catalog/qpudbgkrvftjlo5c1yma.png","col9": 5,"col10": "292970573359743501"
}
]
const saveData = [{
"col0": "Snappy","col10": "292970573359743501"
}
]
这是我的实现方式,saveData 状态依赖于到达 useState,所以它总是在变化。
function compareArray(oldItem,newItem) {
const compared = {};
for (const key in oldItem) {
if ((key == 'col10' || oldItem[key] != newItem[key]) && Object.hasOwnProperty.call(newItem,key) && Object.hasOwnProperty.call(oldItem,key)) {
compared[key] = newItem[key];
}
}
return compared;
}
oldState.map((old,i) => [old,saveData[i]]).forEach((item) => console.log(compareArray(...item)));
更新:每次比较后,它都会向对象添加属性,我希望每次 onblur 事件触发时只有最近更改的属性,这意味着用户已离开输入并触发我的保存突变。
这是一张屏幕截图,显示了对象中的多个属性,它应该只有一个而不是 ID。它应该一起替换对象,而不是每次比较都添加它。数组中还有两个对象,我只需要最近更改的一个,因为我在每次比较时都会触发保存突变,并且只需要一个具有两个字段的对象,即已更改的字段和 id。
解决方法
我认为你需要合并你的对象才能只有一个,就像这样:
const oldState = [{
"col0": "Decor","col1": "2021-03-31","col2": "okok","col3": true,"col4": 7,"col5": 5,"col6": "Curation","col7": "fsaf","col8": "https://res.cloudinary.com/kitson-co/image/upload/v1615646495/catalog/sse5zxtklsj3ib730zjy.png","col9": 4,"col10": "292959180223939085"
},{
"col0": "Decor","col2": "fdsafd","col4": 3,"col5": 3,"col7": "fdsfsa","col8": "https://res.cloudinary.com/kitson-co/image/upload/v1615657360/catalog/qpudbgkrvftjlo5c1yma.png","col9": 5,"col10": "292970573359743501"
}
]
const saveData = [{
"col0": "Snappy","col10": "292970573359743501"
}
]
function compareArray(oldItem,newItem) {
const compared = {};
for (const key in oldItem) {
if ((key == 'col10' || oldItem[key] != newItem[key]) && Object.hasOwnProperty.call(newItem,key) && Object.hasOwnProperty.call(oldItem,key)) {
compared[key] = newItem[key];
}
}
return compared;
}
let myObject = {}
oldState.map((old,i) => [old,saveData[i]]).forEach((item) => myObject = {...myObject,...compareArray(...item)}
);
console.log(myObject)
此函数将遍历两个状态并比较每个值。如果新值不相同,它会将其添加到对象中。如果对象具有属性,则它会添加 col10
属性并将其添加到已更改对象的列表中。
const getStateDiff = (oldState,newState) => {
const differences = [];
for (let i = 0; i < oldState.length; i++) {
const oldStateKeys = oldState[i];
const newStateKeys = newState[i];
const entryDiff = {};
for (let key in oldStateKeys) {
if (
newStateKeys.hasOwnProperty(key) &&
oldStateKeys[key] !== newStateKeys[key]
) {
entryDiff[key] = newStateKeys[key];
}
}
if (Object.keys(entryDiff).length > 0) {
entryDiff['col10'] = newStateKeys['col10'];
differences.push(entryDiff);
}
}
return differences;
};
const oldState = [
{
"col0": "Decor","col10": "292970573359743501"
}
];
const saveData = [
{
"col0": "Snappy","col2": "fdsaf","col10": "292970573359743501"
}
];
console.log(getStateDiff(oldState,saveData));