_.differenceBy
从 A 数组中筛选出 B 数组中不存在的选项,注意是有顺序关系的!
_.difference([2, 1], [2, 3]) // => [1]
_.difference([2, 3], [2, 1]) // => [3]
实际需求:从 allChannels 筛选出 myChannels 不包含的选项
const allChannels = [
{ id: 2, name: '开发者资讯' },
{ id: 3, name: 'ios' },
{ id: 4, name: 'c++' },
{ id: 5, name: 'android' },
{ id: 6, name: 'css' },
{ id: 8, name: '区块链' },
{ id: 9, name: 'go' },
{ id: 10, name: '产品' },
{ id: 11, name: '后端' },
{ id: 12, name: 'linux' },
{ id: 13, name: '人工智能' },
{ id: 14, name: 'php' },
{ id: 15, name: 'javascript' },
{ id: 16, name: '架构' },
{ id: 17, name: '前端' },
{ id: 18, name: 'python' },
{ id: 19, name: 'java' },
{ id: 20, name: '算法' },
{ id: 21, name: '面试' },
{ id: 22, name: '科技动态' },
{ id: 23, name: 'js' },
{ id: 24, name: '设计' },
{ id: 25, name: '数码产品' },
{ id: 1, name: 'html' },
{ id: 7, name: '数据库' },
{ id: 26, name: '软件测试' },
{ id: 27, name: '测试开发' },
{ id: 31, name: 'test4' },
{ id: 32, name: 'test18' },
{ id: 41, name: 'test17' },
];
const myChannels = [{ id: 0, name: '推荐' }, { id: 11, name: '后端' }, { id: 12, name: 'linux' }, { id: 13, name: '人工智能' }, { id: 17, name: '前端' }, { id: 18, name: 'python' }, { id: 7, name: '数据库' }];
普通代码实现
// findIndex 找到第一个符合条件的索引,找不到返回 -1
allChannels.filter(allChannel => myChannels.findIndex(myChannel => myChannel.id === allChannel.id) === -1);
allChannels.filter(allChannel => !myChannels.some(myChannel => myChannel.id === allChannel.id));
利用 lodash
const _ = require('lodash');
_.differenceBy(allChannels, myChannels, 'id');
_.xor
_.xor 可以求两个数组的差集,注意和 _.differenceBy 进行区分
const _ = require('lodash');
_.xor([2, 1], [2, 3]); // => [1, 3]