1

I worried how I can filter array of object with another array of object and get items which not have on first array of object

For example:

let firstData = [
    {
        name: 'A',
        title: 'A'
    },
    {
        name: 'B',
        title: 'B'
    },
    {
        name: 'C',
        title: 'C'
    }
]


let secondData = [
    {
        name: 'B',
        title: 'B'
    }
]

I want to get item's which not have in each array of object in this case name: A and name: C

eg how compare them with name property?

2
  • write out the output you want, what you're asking is unclear Commented Aug 22, 2019 at 15:21
  • I think there is clear question. I wan't to get items which no have in two array of objects too Commented Aug 22, 2019 at 15:22

5 Answers 5

1

Try more general: firstData without secondData (left) PLUS secondData without firstData (right)

let left  = firstData.filter(x=> !secondData.find(y=> x.name==y.name));
let right = secondData.filter(x=> !firstData.find(y=> x.name==y.name));
let result = left.concat(right);

let firstData = [
    {
        name: 'A',
        title: 'A'
    },
    {
        name: 'B',
        title: 'B'
    },
    {
        name: 'C',
        title: 'C'
    }
]


let secondData = [
    {
        name: 'B',
        title: 'B'
    },
    
    {
        name: 'D',
        title: 'D'
    }
]

let left  = firstData.filter(x=> !secondData.find(y=> x.name==y.name));
let right = secondData.filter(x=> !firstData.find(y=> x.name==y.name));
let result = left.concat(right);

console.log(result);

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

Comments

1

Filter the first array and check if some of the second array has an object with the same name property :

let firstData = [
  {
    name: "A",
    title: "A"
  },
  {
    name: "B",
    title: "B"
  },
  {
    name: "C",
    title: "C"
  }
];

let secondData = [
  {
    name: "B",
    title: "B"
  }
];

const result = firstData.filter(
  ({ name }) => secondData.some(({ name: secondName }) => secondName !== name)
);

console.log(result);

Comments

1

How about this:

const filteredElements = firstData.reduce((acc, firstElement) => {
    for(let secondElement of secondData) {

        for(let firstProperty in firstElement) // Does the first element have a value that doesn't exist in the second element?
            if(!secondElement.hasOwnProperty(firstProperty) || secondElement[firstProperty] !== firstElement[firstProperty])
                return acc.concat(firstElement)

        for(let secondProperty in secondElement) // Does the second element have a value that doesn't exist in the first element?
            if(!firstElement.hasOwnProperty(secondProperty) || firstElement[secondProperty] !== secondElement[secondProperty])
                return acc.concat(firstElement)

        return acc // No differing values means this element exists in the second object, so we ignore it       
    }


    return acc.concat(firstElement)
}, [])

console.log(filteredElements) // A and C

Edit: this would compare all values in both objects and look for a difference. If you wish to compare only a specific value, you may set firstProperty and secondProperty to your desired fields' names.

Comments

0

Using lodash is the easiest way to archive it:

_.differenceWith(firstData,secondData, (left, right) => left.name === right.name)

let firstData = [
  {
    name: "A",
    title: "A"
  },
  {
    name: "B",
    title: "B"
  },
  {
    name: "C",
    title: "C"
  }
];

let secondData = [
  {
    name: "B",
    title: "B"
  }
];
console.log(
  _.differenceWith(firstData,secondData, (left, right) => left.name === right.name)
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

2 Comments

It's return empty array
I just add the snippet for testing
0

Two Array Compare

Compare the two array with all data like Name & Title

    let firstData = [
    {
        name: 'A',
        title: 'A'
    },
    {
        name: 'B',
        title: 'F'
    },
    {
        name: 'C',
        title: 'C'
    }
];

let secondData = [
    {
        name: 'B',
        title: 'B'
    },
    {
        name: 'C',
        title: 'C'
    },
    {
        name: 'D',
        title: 'D'
    }
];

var First = firstData.filter(item => !secondData.find(e => item.name == e.name && item.title == e.title));

var Second  = secondData.filter(item => !firstData.find(e => item.name == e.name && item.title == e.title));

let result = First.concat(Second);

console.log(result);

//output

// Array(5)
// 0: {name: "A", title: "A"}
// 1: {name: "B", title: "F"}
// 2: {name: "B", title: "B"}
// 3: {name: "D", title: "D"}
// length: 4

Source Code

let firstData = [
    {
        name: 'Apple',
        title: 'Apple'
    },
    {
        name: 'Banana',
        title: 'Fruits'
    },
    {
        name: 'Cat',
        title: 'Cat'
    }
];

let secondData = [
    {
        name: 'Banana',
        title: 'Banana'
    },
    {
        name: 'Cat',
        title: 'Cat'
    },
    {
        name: 'Dog',
        title: 'Dog'
    }
];

var First = firstData.filter(item => !secondData.find(e => item.name == e.name && item.title == e.title));

var Second  = secondData.filter(item => !firstData.find(e => item.name == e.name && item.title == e.title));

let result = First.concat(Second);

console.log(result);



//Output

// (4) [{…}, {…}, {…}, {…}]
// 0: {name: "Apple", title: "Apple"}
// 1: {name: "Banana", title: "Fruits"}
// 2: {name: "Banana", title: "Banana"}
// 3: {name: "Dog", title: "Dog"}
// length: 4

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.