1

I have two arrays simplified like this.

var a = [{
 number: 1,
 name: "A"
}, {
 number: 2,
 name: "B"
}, {
 number: 3,
 name: "C"
}, {
 number: 4,
 name: "D"
}, {
 number: 5,
 name: "E"
}, {
 number: 6,
 name: "F"
}];

var b = [{
 number: 3,
 name: "C"
}, {
 number: 6,
 name: "F"
}];

What I want is to return an array where a is filtered against b. So the result is this.

var result = [{
 number: 1,
 name: "A"
}, {
 number: 2,
 name: "B"
}, {
 number: 4,
 name: "D"
}, {
 number: 5,
 name: "E"
}];

Have looked at alot of other solutions here on stack overflow but can't get it to work.

I am ok with using libaries like underscore.

2
  • what does "filtered against" mean? you want to combine them? you want all the items in the vesica pisces? you want unique items? clarify. Commented Jan 13, 2017 at 14:57
  • If you are using lodash(upgraded underscore) you can simply find it using _.differenceBy(). Checkout my answer Commented Jan 13, 2017 at 15:23

6 Answers 6

6

It is possible to achieve with lodash by the one-line solution.

var a = [{
 number: 1,
 name: "A"
}, {
 number: 2,
 name: "B"
}, {
 number: 3,
 name: "C"
}, {
 number: 4,
 name: "D"
}, {
 number: 5,
 name: "E"
}, {
 number: 6,
 name: "F"
}];

var b = [{
 number: 3,
 name: "C"
}, {
 number: 6,
 name: "F"
}];

var result = _.differenceWith(a, b, _.isEqual);

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

Sign up to request clarification or add additional context in comments.

Comments

2
var a = [{
 number: 1,
 name: "A"
}, {
 number: 2,
 name: "B"
}, {
 number: 3,
 name: "C"
}, {
 number: 4,
 name: "D"
}, {
 number: 5,
 name: "E"
}, {
 number: 6,
 name: "F"
}];

var b = [{
 number: 3,
 name: "C"
}, {
 number: 6,
 name: "F"
}];

var _ = require('lodash');
var result = _.differenceBy(a,b,'name');

For more informaiton please refer Lodash documentation: https://lodash.com/docs/#differenceBy

4 Comments

what if author wants to check not only name field?
@MaximKuzmin Your solution is better.
So to use lodash I have to change out all my underscore functions? Doesn't look like they work together.
@stibay Actually lodash is a clone of underscore with more features(plenty more). It is a good idea to switch to lodash. Most of the functions will be identical, though some may be breaking. Just verify it. Meanwhile you can use(install) each funcitons of lodash individually. Checkout npmjs.com/browse/keyword/lodash-modularized You can install this function alone by npm install lodash.differenceBy
2

You can use Array#filter. Something like that:

const filterData = (a,b) => {
    return a.filter( (itemA) => {
        return b.some( (itemB) => { 
            return (itemA.number === itemB.number); 
         });
  });
}

I just created a fiddle to test the code: https://jsfiddle.net/mrlew/pb1qqeyd/3/ (you'll have to open console to check results).

Or... in one-line:

const filterData = (a,b) => a.filter( (itemA) => b.some( (itemB) => (itemA.number === itemB.number) ) );

EDIT: thanks to @kzh suggestions, edited to use .some.

1 Comment

You should probably use some instead of forEach so that it does not iterate the entire array.
1

You can use the in-built filter function in JavaScript to filter an array with another array check the below code snippet.

var a = [{
  number: 1,
  name: "A"
}, {
  number: 2,
  name: "B"
}, {
  number: 3,
  name: "C"
}, {
  number: 4,
  name: "D"
}, {
  number: 5,
  name: "E"
}, {
  number: 6,
  name: "F"
}];

var b = [{
  number: 3,
  name: "C"
}, {
  number: 6,
  name: "F"
}];

var result = a.filter(function(currentValue, index, arr) {
  var found = false;
  for (var i = 0; i < b.length; i++) {
    if (currentValue.number === b[i].number) {
      found = true;
      break;
    }
  }

  if (!found) {
    return currentValue;
  }
});

console.log(result);

Comments

0

You can do this with plain javascript using filter(), some() and every().

var a = [{"number":1,"name":"A"},{"number":2,"name":"B"},{"number":3,"name":"C"},{"number":4,"name":"D"},{"number":5,"name":"E"},{"number":6,"name":"F"}]
var b = [{"number":3,"name":"C"},{"number":6,"name":"F"}]

var result = a.filter(function(o) {
  return !b.some(function(e) {
    return Object.keys(o).length == Object.keys(e).length && Object.keys(o).every(function(k) {
      return e[k] == o[k]
    })
  })
})

console.log(result)

Comments

0
var v1 = JSON.parse(a);
var v2 = JSON.parse(b);

var v3 = [] ;


function objectEquals(v1, v2) {

    if (typeof(v1) !== typeof(v2)) {
        return false;
    }
if (v1 instanceof Object && v2 instanceof Object) {

  for (k in v1) {
            r = objectEquals(v1[k], v2[k]);
            if (!r) {
              v3.push(v1[k]);  

            }
        }



}

}

// call the above method passing your two object, and return a new unique array


objectEquals(v1, v2) ;

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.