Remove array of objects from another array of objects

前端 未结 4 1878
情话喂你
情话喂你 2021-02-06 11:17

Assume we have the following arrays of objects to be compared based on property id:

a = [{\'id\':\'1\', \'name\':\'a1\'}, {\'id\':\'2\', \'name\':\'         


        
相关标签:
4条回答
  • 2021-02-06 11:52

    How about this solution? It assumes that 'b' is also an array so for each element of 'a' you check if there is a matching object in 'b'. If there is a matching object then return a false in the filter function so that that element is discarded.

    var a = [{
      'id': '1',
      'name': 'a1'
    }, {
      'id': '2',
      'name': 'a2'
    }, {
      'id': '3',
      'name': 'a3'
    }]
    var b = [{
      'id': '2',
      'name': 'a2'
    }]
    
    var c = a.filter(function(objFromA) {
      return !b.find(function(objFromB) {
        return objFromA.id === objFromB.id
      })
    })
    
    console.log(c)

    0 讨论(0)
  • 2021-02-06 11:53

    First, you build just a map of the ids you want to delete. Then, you filter your first array with it, like that:

    var a = [{
      'id': '1',
      'name': 'a1'
    }, {
      'id': '2',
      'name': 'a2'
    }, {
      'id': '3',
      'name': 'a3'
    }];
    var b = [{
      'id': '2',
      'name': 'a2'
    }];
    
    var idsToDelete = b.map(function(elt) {return elt.id;});
    var result = a.filter(function(elt) {return idsToDelete.indexOf(elt.id) === -1;});
    console.log(result)

    0 讨论(0)
  • 2021-02-06 12:00

    Here is a nice one line answer :)

    Basically, you can filter, as you were trying to do already. Then you can also filter b for each a element and if the length of the filtered b is zero, then you return true because that means the a element is unique to a.

    var a = [{
      'id': '1',
      'name': 'a1'
    }, {
      'id': '2',
      'name': 'a2'
    }, {
      'id': '3',
      'name': 'a3'
    }];
    
    var b = [{
      'id': '2',
      'name': 'a2'
    }];
    
    c = a.filter( x => !b.filter( y => y.id === x.id).length);
    console.log(c);

    0 讨论(0)
  • 2021-02-06 12:03

    Easy with new ES6 Syntax

    Second and Third way are more performant i guess....

    a.filter(i => !b.filter(y => y.id === i.id).length); // One Way
    a.filter(i => !b.find(f => f.id === i.id)); // Second Way
    a.filter(i => b.findIndex(f => f.id === i.id)) // Third Way
    
    0 讨论(0)
提交回复
热议问题