フリーワードの&検索 自分用

const tgtList = [
  {
    id: 1,
    firstName: '太郎',
    lastName: '田中',
    companyName: '某企画',
    email: 'tanaka_taro@boukikaku.com',
    status: 1,
  },
  {
    id: 2,
    firstName: '太郎',
    lastName: '鈴木',
    companyName: '某企画',
    email: 'suzuki_taro@boukikaku.com',
    status: 1,
  },
  {
    id: 3,
    firstName: '花子',
    lastName: '山田',
    companyName: '企画会社',
    email: 'yamada@abc.com',
    status: 1,
  },
]
function getFilterdList({
  searchword,
  specifiedKeys,
}: {
  searchword: string
  specifiedKeys?: string[]
}): typeof tgtList {
  const defaultKeys = [
    'firstName',
    'lastName',
    'companyName',
    'email',
    'fullName', // デフォルトでは足す
  ]
  const searchwordList = searchword.trim().split(/\s+/)
  const keys = specifiedKeys ? specifiedKeys : defaultKeys
  return !searchword.trim()
    ? tgtList
    : tgtList.filter((listItem) => {
        const tmpListItemForFiltering: {
          [key in string]?: string | number
        } = Object.assign(
          {},
          listItem,
          keys.includes('fullName')
            ? {
                fullName: listItem.lastName + listItem.firstName,
              }
            : {}
        )
        return searchwordList.every((word) => {
          return keys.some((key) => {
            const itemVal = tmpListItemForFiltering[key]
            return (
              itemVal &&
              typeof itemVal === 'string' &&
              itemVal.includes(word)
            )
          })
        })
      })
}