JAVA SCRIPT/NEXACRO

[JAVA SCRIPT] findRowExpr(VLOOKUP) 구현하기

울면서개발하기 2022. 2. 14. 19:04

① 투비소프트의 XPLATFORM에서

② 인스웨이브의 WebSquare5로 UI 전환 프로젝트를 진행한 적이 있었다.

 

①에는 있었던 findRowExpr, getCaseCount 등등이 ②에는 없었다.

예컨대,

이름이 '울면서잠들기'아니고 28살보다 많은 대상 찾기 → 불가능

 

그리하여,

웹스퀘어에서 사용하기 위한 findRowExpr, getCaseCount 등등을 만들었는데

굳이 웹스퀘어가 아니더라도 자바스크립트를 사용하는 프로젝트라면 활용이 가능할 것 같다.

 

JAVA SCRIPT findRowExpr 구현

조건표현식을 만족하는 첫번째 인덱스를 반환(없으면 undefined)

var arr = [
      {"이름": "안경은", "나이":25, "지역": "서울"} // 0
    , {"이름": "이민준", "나이":25, "지역": "서울"} // 1
    , {"이름": "박주윤", "나이":38, "지역": "충북"} // 2 
    , {"이름": "권영주", "나이":50, "지역": "경기"} // 3
]

function findRowExpr (arrDataList, sExpr){
    sExpr = sExpr.split("$:").join("oRow.");
    var _expr = eval("_expr = function(oRow, rowidx){ return (" + sExpr + ");}");
    arrDataList = arrDataList.filter(function(oRow, rowidx){        
        oRow["rowidx"] = rowidx;
        return _expr(oRow, rowidx); 
    });
    return !arrDataList[0] ? undefined : arrDataList[0]["rowidx"];
}

console.log(findRowExpr(arr, "$:이름 == '박주윤'")); // ==> 2
console.log(findRowExpr(arr, "$:나이 != 25")); // ==> 2
console.log(findRowExpr(arr, "$:나이 > 40")); // ==> 3
console.log(findRowExpr(arr, "rowidx != 0 && $:지역 == '서울'")); // ==> 1
console.log(findRowExpr(arr, "$:이름.indexOf('주') > -1 && $:지역 != '충북'")); // ==> 3

 

JAVA SCRIPT getCaseCount 구현

조건표현식을 만족하는 개수를 반환

var arr = [
      {"이름": "안경은", "나이":25, "지역": "서울"} // 0
    , {"이름": "이민준", "나이":25, "지역": "서울"} // 1
    , {"이름": "박주윤", "나이":38, "지역": "충북"} // 2
    , {"이름": "권영주", "나이":50, "지역": "경기"} // 3
]

function getCaseCount (arrDataList, sExpr){
    sExpr = sExpr.split("$:").join("oRow.");
    var _expr = eval("_expr = function(oRow, rowidx){ return (" + sExpr + ")}");
    return arrDataList.filter(function(oRow, rowidx){      
        oRow["rowidx"] = rowidx;
        return _expr(oRow, rowidx); 
    }).length;
}
console.log(getCaseCount(arr, "$:이름 == '박주윤'")); // ==> 1
console.log(getCaseCount(arr, "$:나이 != 25")); // ==> 2
console.log(getCaseCount(arr, "$:나이 > 40")); // ==> 1
console.log(getCaseCount(arr, "rowidx != 0 && $:지역 == '서울'")); // ==> 1
console.log(getCaseCount(arr, "$:이름.indexOf('주') > -1 && $:지역 != '충북'")); // ==> 1

 

참고

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

 

Array.prototype.filter() - JavaScript | MDN

filter() 메서드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환합니다.

developer.mozilla.org

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/eval

 

eval() - JavaScript | MDN

eval()은 문자로 표현된 JavaScript 코드를 실행하는 함수입니다.

developer.mozilla.org

 

 

번외 WebSqure5 filter 구현

보다 복잡한 조건표현식을 만족하는 필터 구현 

function filter(oDataList, sExpr){
    if(!oDataList) return;
    if(!sExpr) return oDataList.clearFilter(); // Dataset.filter(""); 
    sExpr = sExpr.split("$:").join("oRow.");
    var _expr = eval("_expr = function(oRow, rowidx){ return " + sExpr + ";}");
    oDataList.clearFilter(); // Dataset.filter(""); // 필터 초기화
    // 필터 적용
    oDataList.setColumnFilter({
        type     : "func"
       ,colIndex : 0
       ,key      :
            function(cellData, tmpParam, rowidx){
                var oRow = oDataList.getRowJSON(rowidx);
                oRow["rowidx"] = rowidx; 
                return _expr(oRow, rowidx); //return이 true인 경우 적용하고 false인 경우 skip한다. 
            }
       ,condition:"and"
    });
}

filter(dl_main, "$:국가!='대한민국'")