-1

Trying to find the flaw in my logic. I have a slice of state called companies that is initialized to an empty array:

const [companies, setCompanies] = useState([]);

I have my data coming in which is an array of objects with company data in it. I want to push the company names to the companies state but check if the name already exists there. This is the solution I came up with but for some reason I keep getting each item to show up in the state array even if it already exists.

// Data is an array of objects containing company data including the company name (companyName)

// State
const [companies, setCompanies] = useState([]);
 
useEffect(() => {
    const companyNames = data.map(app => app.companyName);
    const filteredName = companyNames.filter(name => companies.includes(name) === false);
    setCompanies(filteredName);
}, [data])
  
// Expected Output ==> [array with no repeating names]
  
// Current OutPut ==> [all names even if they appear more than once]
jarmod
  • 71,565
  • 16
  • 115
  • 122
Rhyez
  • 49
  • 4
  • 1
    Why don't you test this with plain JavaScript, minus all the React bits, to understand if the problem is in your map/filter or in your React effect/state usage? – jarmod Apr 01 '22 at 23:02
  • `const filteredName = Array.from(new Set(companyNames))`. Up to you how to deal with capitalization and whitespace (but [this](https://stackoverflow.com/a/29783624/2487517) seems useful) – Tibrogargan Apr 01 '22 at 23:19

2 Answers2

3

The javascript set object is tailor-made for this.

see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

// Use to remove duplicate elements from the array

const numbers = [2,3,4,4,2,3,3,4,4,5,5,6,6,7,5,32,3,4,5]

console.log([...new Set(numbers)])

// [2, 3, 4, 5, 6, 7, 32]
Dave Pritlove
  • 2,601
  • 3
  • 15
  • 14
1

You could filter the array before you process it to get only unique values, like so:

[1,2,3,2,4,3,1].filter((el, index, arr) => arr.indexOf(el) === index) // yields [1,2,3,4]

or use a Javascript Set.

Tony BenBrahim
  • 7,040
  • 2
  • 36
  • 49