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 !
-
@KamilKiełczewski yesGanesh Pandiyan– Ganesh Pandiyan2018年12月20日 10:29:22 +00:00Commented Dec 20, 2018 at 10:29
4 Answers 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);
Comments
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 simplerFirst 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
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