jquery DataTable 관련 질문드립니다!!

조회수 598회

DataTable을 통해 테이블을 만들고 정렬을 하는 과정에서 문제가 생겨 질문드립니다.

모두 잘 정렬이 되는데 테이블의 한 열의 데이터가 아래와 같은 형식입니다.

12 (10%)
37 (2.1%)
1 (0.2%)
111 (1.8%)

위와같은 데이터 형식을 가졌는데 정렬을 눌렀을 때 %기준으로 정렬이 되도록 하고 싶습니다.

어떤식으로 하면 ()안의 숫자를 인식해서 정렬할 수 있을까요?

1 답변

  • SELECT * 해서 나온 실제 DB 데이터가 퍼센트값까지 포함한 문자열이라면... 성능을 포기하고 사용자 정의 정렬을 적용해서 응답으로 넘겨줘야겠죠. (지금 사례에서 알 수 있듯이, 이런 데이터는 안 좋은 형태의 데이터입니다. 이를테면 percentage 같은 이름의 별도 컬럼이 존재해서 거기에 저 퍼센트 값들만 따로 있어야 하지요. 그러면 말이 쉬운데.)

    PHP라면 이렇게 합니다. 어떤 순서/원리 로 전개되는지만 살펴보세요.

    // 변수 설명
    // $data 는 filteredData 배열
    // $orderBy 는 datatable 이 넘긴 정렬기준컬럼
    // $orderDirection 은 datatable 이 넘긴 정렬방향 (asc / desc)
    
    // 문제의 컬럼 이름은 'col3' 이라고 가정함
    if ($orderBy == 'col3') {
    
        // usort(배열, 콜백(a, b)) 함수는 배열을 콜백 결과에 따라 정렬해준다.
        // 이 콜백은 예컨대 a가 앞에 와야 할 경우 음수를 반환해야 한다.
        usort($data, function ($a, $b) use ($orderDirection) {
    
            // 문자열 쪼개기 기법으로 괄호 안의 문자열을 얻는다.
            // 이것때문에 번번이 regex 매칭을 돌리는 건 너무 빡세므로...
            $rightSideA = explode(' (', $a['col3'])[1];
            $percentageA = (float) str_replace('%)', '', $rightSideA);
            $rightSideB = explode(' (', $b['col3'])[1];
            $percentageB = (float) str_replace('%)', '', $rightSideB);
    
            // float 2개를 얻었으므로 이걸 기준으로 정렬한다.
            return $orderDirection == 'desc' ?
                $percentageB - $percentageA :
                $percentageA - $percentageB;
        });
    
    }
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)