① 투비소프트의 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, "$:국가!='대한민국'")
'JAVA SCRIPT > NEXACRO' 카테고리의 다른 글
| [NEXACRO] typeof 가 모두다 'object' ? (0) | 2025.01.17 |
|---|---|
| [NEXACRO] 넥사크로 불편요소 (0) | 2024.11.08 |
| [JAVA SCRIPT] 넥사크로 eval 회피(브라켓 표기) (0) | 2023.10.26 |
| [JAVA SCRIPT] 브라우저 개발자도구를 활용한 넥사크로 디버깅 (0) | 2023.10.11 |
| [JAVA SCRIPT] Number 함수의 동작 방식(객체의 형변환)(nexacro.Decimal에 대한 고찰) (0) | 2023.08.30 |