1

my tried code is :

    const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
    const sasas = [];
    const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
    data2.map((io) => {
     sasas.push(io.id);
     });
    
    sasas.forEach((ik) => {
     for (let i = 0; i < data1.length - 1; i++) {
       if (data1[i].id === ik) {
          data1.splice(i, 1);
            }
          }
      });
    console.log(data1);

i have two arrays and i map the data2 data and getting id values into sasas.

then forEach the sasas data ,

and use forloop to splice the index data of the data1.

then getting the answer is id :1 , id:3, id:5 objects in data1.

but my expected out put is :

const data1 = [{ id: 1, name: 'dd' },{ id: 3, name: 'dd' }];

please help me !

1
  • @KamilKiełczewski yes Commented Dec 20, 2018 at 10:29

4 Answers 4

4

Try this

data1.filter(x=> !data2.some(y=> y.id==x.id ))

const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];

let result = data1.filter(x=>!data2.some(y=>y.id==x.id))

console.log(result);

Above short solution time complexity is O(n*m), below O(n+m) version (n,m are arrays lengths):

let h = {}; data2.map(x=>h[x.id]=1); 
let result = data1.filter(x=>!h[x.id]);

const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];

let h = {}; data2.map(x=>h[x.id]=1);     // we use hash map with data2 ids
let result = data1.filter(x=>!h[x.id]);

console.log(result);

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

Comments

2

You can try following 2 approaches. Also, in place of creating an Array you can use Set (better performance)

Update existing array using while loop

const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];

const sasas = data2.reduce((a,{id}) => a.add(id), new Set())
let i = 0;
while(i < data1.length) {
  if(sasas.has(data1[i].id)) {
    data1.splice(i,1);
  } else i++;
}
console.log(data1);

Create new array using Array.filter

const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];

const sasas = data2.reduce((a,{id}) => a.add(id), new Set())

const result = data1.filter(({id}) => !sasas.has(id));
console.log(result);

2 Comments

temp = new Set(data2.map(({id}) => id) would be simpler
@HMR - That is simpler to see but I think with this approach total iterations will be 2n whereas the approach I have followed will have n iterations.
2

First of all, you could use that map better, instead of

data2.map((io) => {
    sasas.push(io.id);
});

you could simply:

sasas = data2.map(io => io.id);

Your error:

for (let i = 0; i < data1.length - 1; i++) {

That means you never check the last index of the array, you can either change the < to a <= or simply remove the -1.

This should work:

for (let i = 0; i < data1.length; i++) {

Array.filter

The functionality you are trying to achieve is easily obtainable via .filter() function, like this:

    const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
    const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
    const sasas = data2.map((io) => io.id);
    
    var result = data1.filter(e => sasas.indexOf(e.id) === -1)
    console.log(result);

Comments

1

Because of this loop, i is stopped at data1.length - 2

for (let i = 0; i < data1.length - 1; i++) {

Variable i should be from 0 to data1.length - 1, which makes the condition become

i < data1.length

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.