0

I'm trying to create a drop-down autocomplete search input using Headless UI in react.

My data in the JSON file is nested as follows:


{

    "Java": [

        {

            "course_number": "Java101",

            "course_title": "Introduction to Java"

        },

        {

            "course_number": "Java102",

            "course_title": "Advanced Java"

        },


    "JS": [

        {

            "course_number": "JS101",

            "course_title": "Introduction to JavaScript"

        },

        {

            "course_number": "JS02",

            "course_title": "Advanced JavaScript"

        },


    "Python": [

        {

            "course_number": "Python101",

            "course_title": "Introduction to Python"

        },

        {

            "course_number": "Python102",

            "course_title": "Advanced Python"

        }

    ]

}

I want the autocomplete drop box to display the following format:

  • Java

  • Java101

  • Java102

  • JavaScript

  • JS101

  • JS102

  • Python

  • Python101

  • Python102

My code does that only if you enter the full key, but if you enter part of the key, it only displays the keys without the values (course names).

My code:


import { useState } from 'react'

import { Combobox } from '@headlessui/react'

import './SearchComponent.css'

import CourseData from "../202210-departments.json"

const courses = CourseData



function SearchComponent() {

    const [selectedCourse, setSelectedCourse] = useState(courses[0])

    const [query, setQuery] = useState('')



    const filteredCourses =



        query === '' ? Object.keys(courses)

            : Object.keys(courses).includes(query)

                ? [query, ...courses[query].map(x => x.course_number)]

                : Object.keys(courses).filter(x => x.includes(query))

    return (
        <Combobox value={selectedCourse} onChange={setSelectedCourse}>
            <Combobox.Input onChange={(event) => setQuery(event.target.value)} />
            <Combobox.Options>
                {filteredCourses.map((course) => (
                    <Combobox.Option key={course} value={course}>
                        {course}
                    </Combobox.Option>
                ))}
            </Combobox.Options>
        </Combobox>
    )
}
export default SearchComponent;

0 Answers0