아네사
23
2020-02-01 16:03:13
6
463

JavaScript 로직 질문드립니다.


안녕하세요,


javascript로 두개의 해시맵 상의 값을 비교하는 로직을 짰는데 속도가 너무 느려서 도움을 받고 싶어서 글올립니다. 

미리 답변 감사합니다.


환경 : springframework 사용중이며 grid유틸을 사용해서 grid에 값이 있음

grid내용 : 판매코드, 판매일자, 금액(반환은 마이너스금액). 구매와 반품의 경와 판매코드는 동일하다.

원하는 로직 : 상품을 선택 후 저장버튼을 클릭했을 때 다음 기준으로 유효한지 확인한다.

 > 같은 판매코드, 판매일자의 연월이 같고 금액의 +/-가 0원이면 유효성 통과 


그래서 펑션을 대략 다음처럼 짰는데요 

속도가 좀 느려서 혹시 더 좋은 방법이 있을지 문의드립니다.


function fn_cancelOrder(gridNm){


// 선택건 가져오기

var selRow = Grids.SalesOrderList.GetSelRows();

if(selRow.length == 0) return ;

var chkErr = true; // 유효성 체크

// HashMap 사용

HashMap = function(){

this.map = new Array();

}

HashMap.prototype = {

put : function(key, value){

this.map[key] = value;

},

get : function(key){

return this.map[key];

}

};

// 상품코드, 판매일자별로 금액  sum

var tempRow = selRow;

for(var i=0;i<selRow.length;i++){

for(var j=0;j<tempRow.length;j++){

// 판매년월이 같은지 확인

if(selRow[i].sCode == tempRow[i].sCode){

var t1 =  selRow[i].sDate.toString();

var t2 = tempRow[j].sDate.toString();

if(t1.substr(0,6) != t2.substr(0,6)){

alert("판매번호[" + selRow[i].sCode + "]의 판매년월이 동일하지 않습니다.");

chkErr = false;

break;

}

}

// 판매번호별로 sum금액 구하기

var tempAmount = map.get(selRow[i].sCode);

if(tempAmount == null){

map.put(selRow[i].sCode, selRow[i].sAmount);

} else {

map.put(selRow[i].sCode, selRow[i].sAmount + tempAmount);

}

}

}

if (chkErr == false) return;

map.map.forEach(function(val, key){

if(val != 0){

alert("판매번호[" + selRow[i].sCode + "]의 합계금액이 0원이 아닙니다.");

chkErr = false;

}

}

if(chkErr == false) return;

// 이후 세일즈오더 취소처리


}

0
  • 답변 6

  • 니르바나
    2k
    2020-02-01 20:08:28

    느린건 이중포문 돌아서 느린거구요.

    Primary Key가 없나요?

    해시면 해시 Key 값으로 검색하면 바로 나올텐데

    포문 한번만 돌면서 Hash key로 검색하시면 많이 빨라질거에요.


    코드가 그리고 잘 이해가 안가네요..

    tempRow에 selRow를 넣으시는데 그럼 아래 비교하는 모든 것들은 동일 오브젝트라 같을 수 밖에 없는데 비교는 왜 하는건가요..?

  • 아네사
    23
    2020-02-01 20:49:32

    selRow 안에 값이 이런식으로 있다고 쳤을 때 같은 판매코드의 합계를 비교하고 싶은데 적당한 방법을 모르겠어서요 ㅠㅠ

    selRow를 한번만 포문으로 돌면서 현재 선택한 건에 같은 판매코드이면서 전제조건이 맞는지 비교를 하기 좋은 방법이 있을까요??

    작업하고자 하는 것은 다음과 같은 리스트가 있을 때 A 판매는 결국 취소이기 때문에 A판매코드 두건을 선택해서 저장버튼을 클릭하면 리스트에서 삭제하려고 합니다.

    그런데 같은 판매코드이면서 금액 +/-가 0, 즉 전액 환불이고 판매년월이 같은 년월이어야한다는 전제조건이 있어서 비교를 해야합니다.


    선택 | 판매코드 | 판매일자    | 판매구분 | 금액

    -----------------------------------------------------------------

    □      | A             | 2020-01-01| 구입        | 10,000

    □      | B             | 2020-01-02| 구입        | 20,000

    □      | A             | 2020-01-03| 환불        | -10,000

  • 니르바나
    2k
    2020-02-01 20:53:16

    선택하는 시점에 이벤트를 가져오실 수 는 없으세요??

    그때 장바구니던 어디던 판매코드로 추가된게 있는지 보고 금액 비교해서 빼버리면 더 간단할것 같은데,

    다 담아두고 나중에 비교하는 이유가 있을까요??

  • 아네사
    23
    2020-02-01 21:00:55 작성 2020-02-01 21:01:20 수정됨

    선택하는 시점에는 처리를 할수도 있고 안할수도 있어서 리스트에 우선 담아와야해요,,ㅠ,ㅠ


    HashTable에 put이나 get하는 법은 알겠는데 HashTable의 List에서 원하는 값을 가져오는 법이 있을까요? 검색어가 잘못된건지 제가 원하는 답을 찾을 수가 없네요ㅠㅠ

  • 니르바나
    2k
    2020-02-01 21:16:08

    맵을 리스트에 담지마시구 맵에다가 다시 담으세요.

    보니 지금 리스트에 담겨있는거같네요.


    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

  • 아네사
    23
    2020-02-01 22:05:06
    보보님 감사합니다 ^^ 맵을 이용해서 다시 로직 짜볼게요!! 좋은 주말 되세요 ^^
  • 로그인을 하시면 답변을 등록할 수 있습니다.