RFC 6902
在自己的 RFC 6902 diff 做得差不多時,才發現 @chbrown 早就做了 diff 和 patch 。他沒做 move ,但無傷大雅。正如他所說, RFC 6902 diff 不是決定性的。
我的實作更慘,對這些例子,生不出 RFC 範例中給的 patch :
- A.2. Adding an Array Element
- A.4. Removing an Array Element
- A.7. Moving an Array Element
- A.16. Adding an Array Value
肇因於將 Array 跟 Object 都視為 hash 好簡化演算法。如果這樣做,我只需將要比較的兩個集合中所有 key 找出來,再分別取值看有沒有那一方為 undefined 就好。要是使用簡單版的 diff ,甚至只會生出 add, remove, replace 。
為了吐出 move ,我得看過所有的 add ,找出有沒有值相同的 remove 。什麼? remove 沒有留值?只好先存起來,用完再砍掉。 copy 更慘,得看過所有的值,和所有 add 比較,看有沒有一樣的。只好把值都攤平,看完再砍掉。
寫得很開心,但是為了什麼?還是說其實規格默許我按自己方便生出可用的 patch 就好?一如老瀏覽器對壞掉的 HTML 很寬容。