javascript对象与已删除行的差异

时间:2017-03-02 18:15:46

标签: javascript object npm deep-diff

有许多优秀的SO&对于对象差异的npm解决方案,但是我无法找到成功处理已删除行的那个。我找到的解决方案会通过显示所有以下(后续)数组元素向上移动来显示已删除的行。

原始对象可能如下所示:

[   { id : 1    , 'data' : 'one'               }
,   { id : 22   , 'data' : 'two two'           }
,   { id': 333  , 'data' : 'three three three' }
]

并且新对象可能如下所示:

[   { id : 1     , 'data' : 'one'               }
,   // notice missing "two" data element
,   { id : 333   , 'data' : 'three three three' }
]

我正在寻找一个类似于unix diff如何使用普通文本工作的解决方案:

 /usr/bin/cat   lhs.txt; 
 {id:1,data:'one'} 
 {id:22,data:'two two'}
 {id:333,data:'three three three'}

 /usr/bin/cat   rhs.txt; 
 {id:1,data:'one'} 
 {id:333,data:'three three three'}

 /usr/bin/diff    lhs.txt    rhs.txt;
 2d1
 < {id:22,data:'two two'}

似乎最佳解决方案是查找缺少的数据元素,并拼接在 undefined 数据元素中以进行对象比较。我使用underscore采取和差异来想出这个:

if  ( lhs.length > rhs.length)    {  
    var lhsKeys     = _.pluck(lhs,"id")     ;
    var rhsKeys     = _.pluck(rhs,"id")     ;
    for ( var id of _.difference(lhsKeys, rhsKeys)  )      {
        rhs.splice((_.pluck(lhs, 'id').indexOf(id)),0,undefined);
                // replace missing array element with an undefined one
    }
}

现在这两个对象的长度相等,所以我可以将它们与deep-object-diffdeep-diff进行比较

理想情况下,会有一个npm模块或一个下划线函数来简单地确定缺少元素的数组元素行号。

是否有更好,更短或更有效的解决方案?

非常感谢。

0 个答案:

没有答案