underscore 中difference 实现数组相差的方法

2016-04-11 17:02:12

需求是 a数组减去b数组里存在的数据,得到新数据 查询文档得知


difference_.difference(array, *others)        
       类似于without,但返回的值来自array参数数组,并且不存在于other 数组.

_.difference([1, 2, 3, 4, 5], [5, 2, 10]);
=> [1, 3, 4]

继而的得到提示 将需求里的数据对象转换为字符串即可 直接对比数组里的对象是不可以的  必须转换为字符串 具体实现如下

 
 var _=require('underscore') ;

var ret=[{a:1,b:1,c:1},{a:1,b:1,c:2},{a:2,b:1,c:1},{a:1,b:1,c:1},{a:1,b:1,c:0}]

var c= _.map(ret,function(data, key)
{
   return  JSON.stringify(data)
}
)


var ret1=[{a:1,b:1,c:1},{a:2,b:1,c:1}]

var c1= _.map(ret1,function(data, key)
    {
      return  JSON.stringify(data)
    }
)

var  ret2=_.difference(c, c1);

得到结果

/usr/local/bin/node un.js
[ '{"a":1,"b":1,"c":2}', '{"a":1,"b":1,"c":0}' ]


其实还有一种情况是 数组a 和数组b 数据类型不一样 这个时候就要想办法转换

var _=require('underscore') ;

var ret=[{a:1,b:1,c:1},{a:2,b:1,c:2},{a:3,b:1,c:1},{a:4,b:1,c:1},{a:5,b:1,c:0}]
var ret1=[{a:"1"},{a:"2"}]
var ret2=[] ;
var saveMysql=_.indexBy(ret,'a') ; //得到唯一key 的值
var saveMongo=_.indexBy(ret1,'a') ;// 要对比的格式
console.log('saveMysql',saveMysql);
console.log('saveMongo',saveMongo) ;

var differenceMysql = _.difference(_.keys(saveMysql), _.keys(saveMongo)); //key值相差

var ret3=_.map(differenceMysql,function(senderKey){
  return  saveMysql[senderKey] ;
})   
//得到相差的数组

console.log('相差的数组',ret3) ;

执行结果

saveMysql { '1': { a: 1, b: 1, c: 1 },
  '2': { a: 2, b: 1, c: 2 },
  '3': { a: 3, b: 1, c: 1 },
  '4': { a: 4, b: 1, c: 1 },
  '5': { a: 5, b: 1, c: 0 } }
saveMongo { '1': { a: '1' }, '2': { a: '2' } }
相差的数组 [ { a: 3, b: 1, c: 1 },
  { a: 4, b: 1, c: 1 },
  { a: 5, b: 1, c: 0 } ]


你打算打赏多少钱呢?

打赏
(微信扫一扫)