Forum Discussion

alex_panganiban's avatar
alex_panganiban
Contributor
4 years ago
Solved

Counting Instances in Array Object and Removing Duplicates

As I process an array, I want to see if I have any duplicate names in the array that I am processing. If I encounter a duplicate name, I only want to keep the one where the series contains “Trekker.” How can I do this?

For example, given the shows array below. My goal is to remove the first instance of Spock and keep the instance that contains the word, Trekker.

shows: [
{ name: ‘James T. Kirk’, series: ‘Star Trek’ },
{ name: ‘Spock’, series: ‘Star Trek’, ‘Star Trek: The Next Generation’ },
{ name: ‘Jean-Luc Picard’, series: ‘Star Trek: The Next Generation’ },
{ name: ‘Worf’, series: ‘Star Trek: The Next Generation’ },
{ name: ‘Spock’, series: ‘Star Trek’, ‘Star Trekker’ }
]

I’ve been able to get rid of duplicate names using the following filter method, however, due to the positioning index, it always gets rid of the one I want to keep.

$shows.filter((show, pos, a) => a.findIndex(item => item.name == a[pos].name) == pos)

In this example, I got all 5 instances of the array back.

$shows.filter((show, pos, a) => a.findIndex(item => item.name == a[pos].name) != pos
&& a[pos].series.contains(“Trekker”)
|| a.findIndex(item => item.name == a[pos].name) == pos)

I thought if I could get the count of the current name, then I could leverage the count value to incorporate in the filters above, however, I can’t figure out how to do that.

$shows.filter(show => show.name == “Spock”).length

$shows.filter((show, pos, a) => a.findIndex(item => item.name == a[pos].name) != pos
&& a[pos].series.contains(“Trekker”)
|| a.findIndex(item => item.name == a[pos].name) == pos && COUNT == 1)

I also tried using the array.prototype.findLastIndex, but either SnapLogic didn’t like it or maybe it’s a Java/Javascript version issue.

Please help. My Javascript skills, especially when using callbacks, sucks. And thank you.