У меня есть следующий код, который является ответом на предыдущий вопрос, который у меня был, но вместо того, чтобы испортить этот вопрос Я хочу повторить, что я на самом деле ищу, потому что я могу кажется, не понял.
Предполагаемый результат, который я хочу, - это всего лишь один объект с измененными значениями и таким идентификатором. Однако это необходимо изменить, чтобы он не складывался, как сейчас, при каждом изменении экземпляра есть другой консольный объект. И я просто хочу, чтобы новейшее сравнение утешало, игнорируя предыдущее. Надеюсь, это имеет смысл. Могу объяснить дальше, если нужно.
Когда я говорю о накоплении, я имею в виду, что при следующем изменении состояния он обслуживает два элемента, затем три, и так далее, и четвертый. Мне просто нужно последнее изменение, чтобы я мог запустить мутацию и обновить свою БД.
Желаемый результат №1 после изменения состояния
{col0:"snappy", col10:"292959180223939085"}
Желаемый результат №2 после изменения состояния
{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",
"col1": "2021-03-31",
"col2": "fdsafd",
"col3": true,
"col4": 3,
"col5": 3,
"col6": "Curation",
"col7": "fdsfsa",
"col8": "https://res.cloudinary.com/kitson-co/image/upload/v1615657360/catalog/qpudbgkrvftjlo5c1yma.png",
"col9": 5,
"col10": "292970573359743501"
}
]
const saveData = [{
"col0": "Snappy",
"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",
"col1": "2021-03-31",
"col2": "fdsafd",
"col3": true,
"col4": 3,
"col5": 3,
"col6": "Curation",
"col7": "fdsfsa",
"col8": "https://res.cloudinary.com/kitson-co/image/upload/v1615657360/catalog/qpudbgkrvftjlo5c1yma.png",
"col9": 5,
"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;
}
oldState.map((old, i) => [old, saveData[i]]).forEach((item) => console.log(compareArray(...item)));
Вот как я это реализую: состояние saveData зависит от состояния использования, поэтому оно всегда меняется.
function AutoSave({ saveData, cookieBearer, oldState }) {
const [saving, setSaving] = useState(false);
const [
updateDecorDoc,
{ data: docData, loading: savingMutate },
] = useMutation(UPDATE_DECOR_DOC, {
context: {
headers: {
authorization: cookieBearer,
},
},
});
const debounceSave = useCallback(
debounce(async (saveData) => {
setSaving(true);
function compareArray(oldItem, newItem) {
const compared = {};
for (let key in oldItem) {
if (oldItem[key] != newItem[key]) {
compared[key] = newItem[key];
compared["col10"] = newItem["col10"];
}
}
return compared;
}
oldState
.map((old, i) => [old, saveData[i]])
.forEach((item) => {
var test = compareArray(...item);
console.log(test)
});
})
);
useEffect(() => {
if (saveData) {
debounceSave(saveData);
}
}, [saveData, debounceSave]);
if (saving) return <p>saving</p>;
if (!saving) return <p>Auto Save on</p>;
}
ОБНОВЛЕНИЕ: после каждого сравнения он добавляет свойства к объекту, я хочу, чтобы каждый раз, когда срабатывает событие onblur, были только недавно измененные свойства, что означает, что пользователь оставил ввод, и я запускаю свою сохраненную мутацию.
Вот скриншот, показывающий несколько свойств в объекте, у него должно быть только одно, кроме идентификатора. Он должен заменять объект целиком, а не добавлять к нему каждое сравнение. В массиве также есть два объекта, мне нужен только последний измененный, потому что я запускаю мутации сохранения при каждом сравнении, и мне нужен только один объект с двумя полями: измененное поле и идентификатор.
compareArray
, которую вы используете, не является моим окончательным редактированием, способ, которым вы ее реализовали, приводит к повторной инициализации ключаcol10
в новом состоянии для каждого ключа в объектеoldItem
. Используйте функцию, которую я закончил из другого вопроса. - person a.mola   schedule 13.03.2021col10
. Вы снова запустили фрагмент? - person a.mola   schedule 13.03.2021oldState
илиsaveData
. - person a.mola   schedule 14.03.2021