Compare two arrays of objects and remove items in the second one that have the same property value

后端 未结 8 789
温柔的废话
温柔的废话 2020-12-06 01:55

All I need to do is compare two arrays of objects and remove items in the second one that have the same property value. For example:

var a = [{\'name\':\'bob         


        
相关标签:
8条回答
  • 2020-12-06 02:03

    The root cause is that you directly splice items from array b while you are in the for loop and pre condition is a and b have same number of items.

    0 讨论(0)
  • 2020-12-06 02:06
    let A = [
      {name: 'a', age: 20},
      {name: 'b', age: 30},
      {name: 'c', age: 10},
    ]
    
    let B = [
      {name: 'a', age: 20},
      {name: 'b', age: 40},
      {name: 'd', age: 10},
      {name: 'e', age: 20},
      {name: 'f', age: 10},
    ]
    
    const compareName = (obj1, obj2)=>{
      return (obj1.name === obj2.name);
    }
    
    const compareAll = (obj1, obj2)=>{
      return (obj1.name === obj2.name && obj1.age=== obj2.age);
    }
    
    let output = B.filter(b=>{
      let indexFound = A.findIndex(a => compareName(a, b));
      return indexFound == -1;
    })
    

    Depending on which Objects you want to remove use:

    1. compareName : Remove objects which have common name
    2. compareAll : Remove objects which have both name & age common

    Also to find common Objects list just add use return index != -1

    PS: Refer my Github for Array Data Manipulation examples in Javascript

    0 讨论(0)
  • 2020-12-06 02:07

    Your problem is, that splice() will change the length of the array, so that your precalculated len value will be too large and the inside the loop you try to access undefined elements.

    A possible solution would be to use the filter() method:

    function remove_duplicates(a, b) {
    
      b = b.filter( function( item ) {
          for( var i=0, len=a.length; i<len; i++ ){
              if( a[i].name == item.name ) {
                  return false;
              }
          }
          return true;
      });
    
      console.log(a);
      console.log(b);
    }
    

    Example Fiddle

    0 讨论(0)
  • 2020-12-06 02:10

    Try this:

    You are starting loop from the 0.

    for (var i = 0, len = a.length; i < len; i++) {
            for (var j = 0, len = b.length; j < len-1; j++) {
                if (a[i].name == b[j].name) {
                    b.splice(j, 1);
                }
            }
        }
    

    Fiddle Demo

    0 讨论(0)
  • 2020-12-06 02:13

    FIDDLE

     for (var i = 0, len = a.length; i < len; i++) { 
            for (var j = 0, len2 = b.length; j < len2; j++) { 
                if (a[i].name === b[j].name) {
                    b.splice(j, 1);
                    len2=b.length;
                }
            }
        }
    
    0 讨论(0)
  • 2020-12-06 02:16

    Instead of using two loops you might also use the findIndex function:

    for (var i = 0, len = a.length; i < len; i++) {
        var ItemIndex = b.findIndex(b => b.name === a[i].name);
    
        a.splice(ItemIndex, 1)
    }
    

    Or if you want to go completely without using a loop you might use the forEach function

    a.forEach(function(item, index, array) {
        var ItemIndex = b.findIndex(b => b.name === item.name);
    
        a.splice(ItemIndex, 1)
    }
    
    0 讨论(0)
提交回复
热议问题