有许多优秀的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-diff或deep-diff进行比较
理想情况下,会有一个npm模块或一个下划线函数来简单地确定缺少元素的数组元素行号。
是否有更好,更短或更有效的解决方案?
非常感谢。