useHangul.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import Hangul from 'hangul-js'
  2. /*
  3. * 키워드 검색 공통 함수
  4. */
  5. let hangul = {
  6. /**
  7. * 키워드로 입력 시 필터 결과 반환(키보드 입력 이벤트)
  8. * @param {*} arr
  9. * @param {*} keyword
  10. * @param {*} filter 대상 키
  11. * @returns
  12. */
  13. fnGetKeywordResult(arr, keyword, filter){
  14. let tempList = []
  15. if (!keyword) {
  16. // 키워드가 없는 경우 > 키워드 검색결과 빈값
  17. tempList = []
  18. }else{
  19. tempList = this.fnFilterList(arr, keyword, filter)
  20. }
  21. let resultObj = {
  22. arr : _cloneDeep(tempList), // 결과 원본 배열
  23. newArr: this.fnReduce(tempList, filter), // 결과 중복제거 배열
  24. }
  25. return resultObj
  26. },
  27. /**
  28. * 필터 키워드 배열 반환
  29. * @param {*} arr 필터처리할 배열
  30. * @param {*} keyword 입력 키워드
  31. * @param {*} key 필터키값
  32. * @returns
  33. */
  34. fnFilterList(arr, keyword, filter){
  35. let tempList = []
  36. tempList = arr.filter((ele) => {
  37. if(ele[filter].toLowerCase().indexOf(keyword.toLowerCase()) > -1){
  38. return true
  39. }
  40. return this.fnCho(keyword, ele[filter])
  41. })
  42. return tempList
  43. },
  44. /**
  45. * 키워드 > 초성 체크
  46. * @params keyword 입력키워드
  47. * @params key 비교할 키값
  48. * @returns Boolean
  49. */
  50. fnCho(keyword, key){
  51. let result = false
  52. // 초성 검색(ㅅㄴㅍ)
  53. let disassemble = Hangul.disassemble(key, true) //2번째 인자로 true를 전달하면 글자마다 독립된 배열을 만들어준다
  54. // disassemble = [[ㅎ,ㅗ,ㅇ],[ㄱ,ㅣ,ㄹ],[ㄷ,ㅗ,ㅇ]]
  55. var cho = ''
  56. for (let i=0,l=disassemble.length; i<l; i++){
  57. cho+=disassemble[i][0]
  58. }
  59. //disassemble의 배열의 첫값을 cho에 첨가한다
  60. // cho = "ㅎㄱㄷ"
  61. let isChoSearch = cho.includes(keyword)
  62. if(isChoSearch){
  63. result= true
  64. }
  65. return result
  66. },
  67. /**
  68. * 중복 카운팅 후 새로운 배열 반환
  69. * @param {*} arr
  70. * @param {*} key
  71. * @returns
  72. */
  73. fnReduce(arr, key){
  74. const result = arr.reduce((accu, item) => {
  75. const index = accu.findIndex(elem => elem.title === item[key]);
  76. if (index !== -1) {
  77. // 중복 count계산
  78. accu[index].count++;
  79. } else {
  80. accu.push({ value: key, title: item[key], count: 1 });
  81. }
  82. return accu;
  83. }, []);
  84. return result;
  85. },
  86. /**
  87. * 입력한 키워드로 검색 시, 결과 반환(검색버튼 또는 엔터 액션)
  88. * @param {*} arr1 배열
  89. * @param {*} keyword
  90. * @returns
  91. */
  92. fnSearchResultList(arr1, keyword){
  93. let findSearch = []
  94. // 발전소명
  95. let sl1 = arr1.filter(ele => ele.title == keyword)
  96. if(sl1.length > 0) findSearch = sl1
  97. return findSearch
  98. },
  99. /**
  100. * 키워드 입력 폼 > 일치하는 문자열 font color설정
  101. * @param {*} title 키워드 결과 리스트 항목명
  102. * @param {*} keyword 입력키워드
  103. * @returns
  104. */
  105. fnSetHighlightKeyword(title, keyword){
  106. let text = _isNumber(title) ? JSON.stringify(title) : title
  107. if (!keyword) return text // 키워드가 없으면 그대로 반환
  108. const regex = new RegExp(`(${keyword})`, 'i'); //첫번째로 일치하는 문자에 대한 정규식
  109. const match = text.match(regex)
  110. if (match) {
  111. const index = match.index
  112. return text.substring(0, index) +
  113. `<span style="color: #2da9d6;">${text.substring(index, index + keyword.length)}</span>` +
  114. text.substring(index + keyword.length)
  115. } else {
  116. return text
  117. }
  118. },
  119. }
  120. export default hangul