From bbdba0ef16857b079be4953941df8f14cfd65d85 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Mon, 2 Nov 2020 23:45:59 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D1=83=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/share/utils.js | 66 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 13 deletions(-) diff --git a/client/share/utils.js b/client/share/utils.js index 5af01b6a..0dd69976 100644 --- a/client/share/utils.js +++ b/client/share/utils.js @@ -130,20 +130,53 @@ export function getObjDiff(oldObj, newObj) { } export function isObjDiff(diff) { - return (_.isObject(diff) && diff.__isDiff); + return (_.isObject(diff) && diff.__isDiff && diff.change && diff.add && diff.del); } export function isEmptyObjDiff(diff) { - return (!_.isObject(diff) || !diff.__isDiff || - (!Object.keys(diff.change).length && - !Object.keys(diff.add).length && - !diff.del.length + return (!isObjDiff(diff) || + !(Object.keys(diff.change).length || + Object.keys(diff.add).length || + diff.del.length ) ); } -export function applyObjDiff(obj, diff, isAddChanged) { - const result = _.cloneDeep(obj); +export function isEmptyObjDiffDeep(diff, opts = {}) { + if (!isObjDiff(diff)) + return true; + + const { + isApplyChange = true, + isApplyAdd = true, + isApplyDel = true, + } = opts; + + let notEmptyDeep = false; + const change = diff.change; + for (const key of Object.keys(change)) { + if (_.isObject(change[key])) + notEmptyDeep |= !isEmptyObjDiffDeep(change[key], opts); + else if (isApplyChange) + notEmptyDeep = true; + } + + return !( + notEmptyDeep || + (isApplyAdd && Object.keys(diff.add).length) || + (isApplyDel && diff.del.length) + ); +} + +export function applyObjDiff(obj, diff, opts = {}) { + const { + isAddChanged = false, + isApplyChange = true, + isApplyAdd = true, + isApplyDel = true, + } = opts; + + let result = _.cloneDeep(obj); if (!diff.__isDiff) return result; @@ -151,21 +184,28 @@ export function applyObjDiff(obj, diff, isAddChanged) { for (const key of Object.keys(change)) { if (result.hasOwnProperty(key)) { if (_.isObject(change[key])) { - result[key] = applyObjDiff(result[key], change[key], isAddChanged); + result[key] = applyObjDiff(result[key], change[key], opts); } else { - result[key] = _.cloneDeep(change[key]); + if (isApplyChange) + result[key] = _.cloneDeep(change[key]); } } else if (isAddChanged) { result[key] = _.cloneDeep(change[key]); } } - for (const key of Object.keys(diff.add)) { - result[key] = _.cloneDeep(diff.add[key]); + if (isApplyAdd) { + for (const key of Object.keys(diff.add)) { + result[key] = _.cloneDeep(diff.add[key]); + } } - for (const key of diff.del) { - delete result[key]; + if (isApplyDel && diff.del.length) { + for (const key of diff.del) { + delete result[key]; + } + if (_.isArray(result)) + result = result.filter(v => v); } return result;