Comparing two arrays of objects, and exclude the elements who match values into new array in JS

前端 未结 6 1653
孤独总比滥情好
孤独总比滥情好 2020-11-28 03:57

here is my use case in JavaScript:

I have two arrays of objects which have properties that match (id & name).

var result1 = [
    {id:1, name:\'S         


        
相关标签:
6条回答
  • 2020-11-28 04:08

    The same result can be achieved using Lodash.

    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', email:'johnny@example.com'},
        {id:4, name:'Bobby', email:'bobby@example.com'}
    ];
    
    var result3 = _(result1) 
            .differenceBy(result2, 'id', 'name')
            .map(_.partial(_.pick, _, 'id', 'name'))
            .value();
    
    console.log(result3);
    <script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>

    You can get the desired result applying a difference between both arrays using the properties "id" and "name" as a way to "link" elements between them. If any of those properties are different, the elements are considered different (improbably in your case because id seems to be unique).

    Lastly, you have to map the result in order to "omit" the undesired properties of the object.

    Hope it helps.

    0 讨论(0)
  • 2020-11-28 04:13

    Check out difference and xor in lodash.

    0 讨论(0)
  • 2020-11-28 04:14

    well, this using lodash or vanilla javascript it depends on the situation.

    but for just return the array that contains the duplicates it can be achieved by the following, offcourse it was taken from @1983

    var result = result1.filter(function (o1) {
        return result2.some(function (o2) {
            return o1.id === o2.id; // return the ones with equal id
       });
    });
    // if you want to be more clever...
    let result = result1.filter(o1 => result2.some(o2 => o1.id === o2.id));
    
    0 讨论(0)
  • 2020-11-28 04:23

    Just using the Array iteration methods built into JS is fine for this:

    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', email:'johnny@example.com'},
        {id:4, name:'Bobby', email:'bobby@example.com'}
    ];
    
    var props = ['id', 'name'];
    
    var result = result1.filter(function(o1){
        // filter out (!) items in result2
        return !result2.some(function(o2){
            return o1.id === o2.id;          // assumes unique id
        });
    }).map(function(o){
        // use reduce to make objects with only the required properties
        // and map to apply this to the filtered array as a whole
        return props.reduce(function(newo, name){
            newo[name] = o[name];
            return newo;
        }, {});
    });
    
    document.body.innerHTML = '<pre>' + JSON.stringify(result, null, 4) +
            '</pre>';

    If you are doing this a lot, then by all means look at external libraries to help you out, but it's worth learning the basics first, and the basics will serve you well here.

    0 讨论(0)
  • 2020-11-28 04:25

    I have searched a lot for a solution in which I can compare two array of objects with different attribute names (something like a left outer join). I came up with this solution. Here I used Lodash. I hope this will help you.

    var Obj1 = [
        {id:1, name:'Sandra'},
        {id:2, name:'John'},   
    ];
    
    var Obj2 = [
        {_id:2, name:'John'},
        {_id:4, name:'Bobby'}
    ];
    
    var Obj3 = lodash.differenceWith(Obj1, Obj2, function (o1, o2) {
        return o1['id'] === o2['_id']
    });
    
    console.log(Obj3);
    //  {id:1, name:'Sandra'}
    
    0 讨论(0)
  • 2020-11-28 04:27

    Here is another solution using Lodash:

    var _ = require('lodash');
    
    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', email:'johnny@example.com'},
        {id:4, name:'Bobby', email:'bobby@example.com'}
    ];
    
    // filter all those that do not match
    var result = types1.filter(function(o1){
        // if match found return false
        return _.findIndex(types2, {'id': o1.id, 'name': o1.name}) !== -1 ? false : true;
    });
    
    console.log(result);
    
    0 讨论(0)
提交回复
热议问题