反向jQuery.extend(true,...)

Ben*_*ank 7 javascript jquery json extend delta

我希望通过对一组已知的默认值进行分类来降低JSON数据的存储要求.基本上,我想要的是jQuery .extend()函数的反转,以便以下测试传递任意JSON兼容对象:

function test_delta(defaults, delta) {
    var current = $.extend(true, {}, defaults, delta);

    QUnit.same(get_delta(current, defaults), delta);
}
Run Code Online (Sandbox Code Playgroud)

在我开始编写自己的文档之前get_delta(),是否有人知道现有的实现?

Mar*_*ope 1

您真正需要的是对象差异(差异)算法。

写起来不太难——



function diff (obj1, obj2) {
   var delta = {};

   for (var x in obj1) {
       if (obj2.hasOwnProperty(x)) {
           if (typeof obj2[x] == "object") {
               //recurse nested objects/arrays
               delta[x] = diff(obj1[x], obj2[x]);
           }
           else {
               //if obj2 doesn't match then - modified attribute
               if (obj2[x] != obj1[x]) {
                   delta[x] = obj1[x];
               }
           }        
       }
       else {
           //obj2 doesn't have this - new attribute
           delta[x] = obj1[x];
       }
   }

   return delta;
}

alert( 
  JSON.stringify(
     diff({ hello : 'world', gone : 'fishing' }, 
          { hello : 'world' })
  )
);

//outputs:
{ gone : 'fishing' }

Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这是一个非常基本的实现 - 您可以通过在单独的对象中返回 obj2 的添加来扩展它以提供完整的差异。

这段代码并非没有错误,对象原型和函数在不同的浏览器中会有不同的处理方式,但它足以作为数据结构的演示。