3
var a = [{id: 14679333, name: "Churchill Downs", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Gulfstream", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true"}] var b = [{id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Charles Town", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Los Alamitos", eventStatusCode: "A", isActive: "true"}] 

Code:

 for(var i=0; i< b.length;i++){ if((b[i].typeName || b[i].name) != (a[i].typeName || a[i].name)){ var c= a.concat(b) console.log("after concat",c) } } 

I am trying to compare both arrays and merge into single array without duplicates but I am getting this output:

c= [{id: 14679333, name: "Churchill Downs", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Gulfstream", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Charles Town", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Los Alamitos", eventStatusCode: "A", isActive: "true"}] 

Expected output:

c = [{id: 14679333, name: "Churchill Downs", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Gulfstream", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Charles Town", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Los Alamitos", eventStatusCode: "A", isActive: "true"}] 
1
  • Hi, welcome to SO! Why don't you take a look at "How do I ask a good question?". There's too much code and any explanation here. Try also to adjust your formatting please. Commented May 17, 2020 at 10:35

4 Answers 4

2

You could take a Set and look for same name and filter the array of all items.

var a = [{ id: 14679333, name: "Churchill Downs", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Gulfstream", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true" }], b = [{ id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Charles Town", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Los Alamitos", eventStatusCode: "A", isActive: "true" }], result = [...a, ...b] .filter( (s => ({ name }) => !s.has(name) && s.add(name)) (new Set) ); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

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

Comments

0

The if statement (b[i].typeName || b[i].name) != (a[i].typeName || a[i].name) is incorrect, even if I know what you mean in spoken english.

It should be (b[i].typeName == a[i].typeName) || (b[i].typeName == a[i].name) || (b[i].name == a[i].typeName) || (b[i].name == a[i].name).

for (var i = 0; i < b.length; i++) { if ((b[i].typeName == a[i].typeName) || (b[i].typeName == a[i].name) || (b[i].name == a[i].typeName) || (b[i].name == a[i].name)) { var c = a.concat(b) console.log("after concat", c) } } 

At the moment, (b[i].typeName || b[i].name) by itself will return false, as will, (a[i].typeName || a[i].name). The full statement therefore always returns false.

What I presume you want to do is ask "is [either this one or this one] equal to [either this one or this one]". To achieve this, you'll have to go through all four combinations one at a time, which is what my code does.

Comments

0

Merge your arrays to a new one, then kill the duplicates:

merge:

let newArr = [...a, ...b]; 

The following filter code will NOT work, if the reference of the inner objects are not the same:

newArr = newArr.filter((item, pos) => { return a.indexOf(item) == pos; }); 

Solution:

In your case do the filtering with this code, if you want to have the name property unique:

let newArr = [...a, ...b]; const temp = {}; for (let i = 0; i < newArr.length; i++) { temp[newArr[i].name]= newArr[i]; } newArr = []; for (let key in temp) { newArr.push(temp[key]); } console.info(newArr); console.info(newArr.map( o => o.name).sort()); 

--> 7 items

Comments

0

Above answers are great. You can achive this with single line, give this code a try:

var a = [{id: 14679333, name: "Churchill Downs", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Gulfstream", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true"}] var b = [{id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Charles Town", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Los Alamitos", eventStatusCode: "A", isActive: "true"}]; var combined = [...a, ...b]; var filtered = [...new Map(combined.map(val=>[val.name, val])).values()]; console.log(filtered);

Comments