【问题标题】:Comparing two arrays of objects and return one array with common values using loadash比较两个对象数组并使用 lodash 返回一个具有共同值的数组
【发布时间】:2018-12-30 15:11:55
【问题描述】:

我必须让对象数组看起来像这样:

var result1 = [
{id:1, name:'Sandra', type:'user', username:'sandra'},
{id:2, name:'John', type:'admin', username:'johnny2'},
{id:3, name:'Peter', type:'user', username:'pete'},
{id:4, name:'Bobby', type:'user', username:'be_bob'}
]; 

var result2 = [
{id:2, name:'John', type:'admin', username:'johnny2'},
{id:3, name:'Peter', type:'user', username:'pete'},
];

如何使用 loadash 获取两个数组中都存在的对象? 还有,如果我们有 N 个对象数组,我们想比较它们并在一个数组中得到共同的值怎么办?

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    您只需使用filtersome 就可以做到这一点

    var result1 = [
      {id:1, name:'Sandra', type:'user', username:'sandra'},
      {id:2, name:'John', type:'admin', username:'johnny2'},
      {id:3, name:'Peter', type:'user', username:'pete'},
      {id:4, name:'Bobby', type:'user', username:'be_bob'}
    ]; 
    
    var result2 = [
      {id:2, name:'John', type:'admin', username:'johnny2'},
      {id:3, name:'Peter', type:'user', username:'pete'},
      {id:15, name:'Pe', type:'usefghjr', username:'pete'},
    ];
    
    let op = result2.filter(e => result1.some(el => el.id === e.id))
    
    console.log(op);

    如果我有更多的数组怎么办

    var result1 = [
      {id:1, name:'Sandra', type:'user', username:'sandra'},
      {id:2, name:'John', type:'admin', username:'johnny2'},
      {id:3, name:'Peter', type:'user', username:'pete'},
      {id:4, name:'Bobby', type:'user', username:'be_bob'}
    ]; 
    
    var result2 = [
      {id:2, name:'John', type:'admin', username:'johnny2'},
      {id:3, name:'Peter', type:'user', username:'pete'},
      {id:15, name:'Pe', type:'usefghjr', username:'pete'},
    ];
    
    var result3 = [{id:3, name:'Peter', type:'user', username:'pete'}];
    
    let array = [result1,result2,result3]
    
    let op = result2.filter(ele => array.every(el => el.some(val => val.id === ele.id)))
    
    console.log(op);

    【讨论】:

    • 如果我们有 4 个或更多数组怎么办?
    • 我找到了一种方法,使用 loadash let finalArray = _.intersectionBy(result1,result2,result3, 'id');
    【解决方案2】:

    您可以使用所有id 构建一个Set,并通过检查具有相同id 的常见对象来过滤数组。

    var result1 = [{ id: 1, name: 'Sandra', type: 'user', username: 'sandra' }, { id: 2, name: 'John', type: 'admin', username: 'johnny2' }, { id: 3, name: 'Peter', type: 'user', username: 'pete' }, { id: 4, name: 'Bobby', type: 'user', username: 'be_bob' }],
        result2 = [{ id: 2, name: 'John', type: 'admin', username: 'johnny2' }, { id: 3, name: 'Peter', type: 'user', username: 'pete' }],
        common = [result1, result2].reduce((a, b) => {
            var s = new Set(a.map(({ id }) => id));
            return b.filter(({ id }) => s.has(id));            
        });
    
    console.log(common);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 2020-06-04
      • 2022-01-02
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      相关资源
      最近更新 更多