• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    미해결

판다님 응용방법이 궁금합니다

21.05.25 00:09 작성 조회수 100

1

판다님 덕분에 엑셀밖에 모르는 제가 기어코 완성을 했답니다.

현재 4가지 유형으로 축소된 테스트지를 완성했습니다.

조금 응용할수 있는방법에 대해 궁금한데요.

1. 결과 페이지 상세 내용 아래에 데이터의 모든 결과값을 아예 나타내주는 방법이있을까요? (쥐 4점, 돼지 3점 ,소 2점 이런식으로)

2. 결과값이 동점일때, 두가지 동시에  나타내는 방법은 없을까요?

3. 마찬가지로 결과값의 차이가 2개 이내일때, 순차적으로 두 결과를 다 나타낼 수 있는방법이 있을까요?

4.모바일버전에서는 가끔 질문지를 두번 터치해야 넘어갈때가 있는데, 어느부분을 조정하면 될까요?

엑셀이면 후딱 만들었을것같은데 이쪽 언어를 모르니 어렵네요 ㅠㅠ 구동할수있는 식이나 방법을 조금알려주시면 제가 열심히 응용해볼께요

답변 부탁드립니다 ㅠ-ㅠ

답변 4

·

답변을 작성해보세요.

1

음.. 제가 이해력이 부족한 것 같습니다.

제가 만들어드린 코드와..? 질문자님이 원하시는 코드의 방향이 무엇이 다른지 잘 모르겠네요,

제가 만들어드린 코드는 상위 5개의 값을 선택하여 보여주는 코드입니다.

모든 결과를 그대로 출력을 원하신다면 그러한 과정없이 바로 출력하면 되는 것 아닐까요..?

index.html

<section id="result" class="mx-auto my-5 py-5 px-3">
      <h1>당신의 결과는?!</h1>
      <div class="resultname">

      </div>
      <div id="resultImg" class="my-3 col-lg-6 col-md-8 col-sm-10 col-12 mx-auto">

      </div>
      <div class="resultDesc">

      </div>
      <div class="row mt-3 mx-auto" style="width: 50%">
        <div id="allResult" class="col-6">

        </div>
        <div class="col-6">
          <button class="btn btn-outline-danger" onclick="js:copy()">복사하기</button>
        </div>
      </div>
      <button type="button" class="kakao mt-3 py-2 px-3" onclick="js:setShare()">공유하기</button>
    </section>

start.js

function calResult() {
  console.log(select);
  //결과 출력을 위한 최대값
  var result = select.indexOf(Math.max(...select));
  return result;
}

function setResult() {
  //기존 코드와 동일
  let point = calResult();
  const resultName = document.querySelector(".resultname");
  resultName.innerHTML = infoList[point].name;

  var resultImg = document.createElement("img");
  const imgDiv = document.querySelector("#resultImg");
  var imgURL = "img/image-" + point + ".png";
  resultImg.src = imgURL;
  resultImg.alt = point;
  resultImg.classList.add("img-fluid");
  imgDiv.appendChild(resultImg);
  const resultDesc = document.querySelector(".resultDesc");
  resultDesc.innerHTML = infoList[point].desc;

  //추가되는 코드
  const allResultDiv = document.querySelector("#allResult");
  allResultDiv.innerHTML = select;
}

share.js

function copy() {
  var tempElem = document.createElement("textarea");
  var target = document.querySelector("#allResult");
  tempElem.value = target.innerHTML;
  document.body.appendChild(tempElem);
  tempElem.select();
  document.execCommand("copy");
  alert("복사되었습니다.");
  document.body.removeChild(tempElem);
}
YANG MINJI님의 프로필

YANG MINJI

질문자

2021.06.07

감사합니다 판다님 ㅠㅠㅠ!! 이게 맞습니다! 기초도 모르니 당연한걸 어렵게 여쭙게되군요 ㅠㅠ...

부족한 저에게 답변주셔서 감사해요! 

정말 정말 감사합니다!!

고생하셨습니다 :)

1

코드가 상당히 복잡해질 수 있습니다.

사용자의 응답 결과에 따라 상위 다섯개의 값이 모두 유효한지 부터 알아보아야 합니다.

(어떠한 경우의 수로 응답을 하든, 5개의 결과가 모두 유효하다면 그냥 단순히 5개만 출력하면 됩니다.)

또한 현재 질문자님의 경우에선..

배열의 인덱스 뿐만 아니라

그 값 역시 필요한 경우이기에 배열의 선언을 object 형태로 하는 것이 더 쉬울 수도 있습니다.

저희가 data.js에서 만든 형태의 데이터형이 object 자료형이나,

해당 자료형에 대한 지식이 없다고 가정하여 코드를 만들어 본다면..

function calResult() {
  //배열 큰 순으로 정렬
  let sortArray = select.sort((a, b) => {
    if (a > b) {
      return -1;
    }
    if (a < b) {
      return 1;
    }
    return 0;
  });
  let maxIdx;
  //최대 5개의 결과만 필요하므로
  for (let i = 0; i < 5; i++) {
    //첫번째, 두번째, 세번째, 네번째, 다섯번째의 값이 0이면
    if (sortArray[i] === 0) {
      //반복문 탈출
      break;
    }
    //maxIdx에 몇번째 결과까지 표현할지 저장
    maxIdx = i;
  }
  console.log(maxIdx, sortArray[maxIdx]);
  //결과의 index배열
  let resultArray = [];
  //결과의 값배열
  let resultValueArray = [];

  for (let i = 0; i < maxIdx; i++) {
    //tempIdx : select배열에서 가장 높은 값의 인덱스
    var tempIdx = select.indexOf(Math.max(...select));
    //tempValue : select배열에서 가장 높은 값
    var tempValue = select[tempIdx];

    //두값을 각 배열에 저장
    resultArray.push(tempIdx);
    resultValueArray.push(tempValue);

    //저장된 값 0으로 초기화
    //다음 반복에서 저장된 값을 제외한 최대값을 찾아야 하므로
    select[tempIdx] = 0;
  }
  //이중배열로 반환
  return [resultArray, resultValueArray];
}

function setResult() {
  let point = calResult();
  const resultName = document.querySelector(".resultname");
  resultName.innerHTML = infoList[point[0][0]].name;

  var resultImg = document.createElement("img");
  const imgDiv = document.querySelector("#resultImg");
  var imgURL = "img/image-" + point[0][0] + ".png";
  resultImg.src = imgURL;
  resultImg.alt = point[0][0];
  resultImg.classList.add("img-fluid");
  imgDiv.appendChild(resultImg);

  const resultDesc = document.querySelector(".resultDesc");
  for (let i = 0; i < point[0].length; i++) {
    let tempSpan = document.createElement("span");
    if (i + 1 != point[0].length)
      tempSpan.innerHTML =
        infoList[point[0][i]].name + " : " + point[1][i] + " / ";
    else tempSpan.innerHTML = infoList[point[0][i]].name + " : " + point[1][i];
    resultDesc.appendChild(tempSpan);
  }
}

이렇게 될 것 같습니다.

결과 페이지는 이렇게 나오겠네요.

YANG MINJI님의 프로필

YANG MINJI

질문자

2021.05.31

판다님 정말 정성스럽게 작성해주셔서 죄송하고 감사할 따름입니다ㅠㅠㅠ

덕분에 프로그래밍언어를 본격적으로 배워야할 필요를 느꼈습니다 너무 귀한 강의 무료로 배포해주셔서 감사합니다 추후 초심자를 위한 유료강의나 따로 하시는 콘텐츠가 있다면 꼭 참여할요!! 

판다님의 답변을 기다리며 저도 프로그래밍언어를 조금이라도 배워야할것같아아이것저것 만지며 보내고 있었답니다

혹시 한가지만 여쭤도 될까요?

테스트결과를 제가 결과를 4가지만 나타내려고 했거든요 거기까진 수월했습니다!

여기서 사용자가 입력해서 나왔던 결과인

console.log(select) 값을 1.결과화면에(공유하기버튼 밑) 보여주고  (ex) 4,5,2,3 ) 2.쉽게 복사할수있게하려면 어떻게 해야할까요? 

복사하는건 다른 소스코드를 응용해볼수있을것같은데 console.log(select) 값을 어떻게 결과화면에 나타낼수 있을지 모르겠습니다

죄송하지만 이해가 안됩니다!

방금 만든 설명을 복사하는 버튼을 구현하고 싶으신건가요?

YANG MINJI님의 프로필

YANG MINJI

질문자

2021.05.31

아뇨

결과페이지가 나오면 개발자도구에서 

[1,0,7,8]

이런으로 값이 뜨잖아요?

이값을 결과 설명 맨밑에 한줄 집어넣고 싶어숩니다!

1

1. sorting된 데이터를 모두 보여주면 될 듯 합니다.

2. 저희는 최대값을 찾기위해 정렬하므로, 0번째 인덱스의 값과 1번째 인덱스의 값이 같을 시 (동점이므로) 두 데이터를 모두 뛰우는 방식으로 코딩을 바꿔볼 수 있을 것 같습니다.

3. 2번의 과정에서 if문의 내용만 조금 바뀔 것 같습니다.

4. 어떤 이유로 위와 같은 버그가 발생하는지 잘 모르겠으나, 아마 애니메이션이 진행되는 동안의 터치 입력이 무시되는 것 같습니다. 저희는 setTimeout을 통해 애니메이션이 끝난 이후 버튼을 생성합니다. 이러한 과정이 불편하시다면 애니메이션을 제거하시고 마찬가지로 setTimeout도 제거하시면 될 것 같습니다.

-

제 수업을 통해서 js를 입문하셨다면, 1~3번에 대한 대답이 충분치 않을 수도 있을 것 같습니다.

현재 코드를 첨부해주시거나, 보다 정확히 구현하시고 싶으신 내용을 말씀해주시면 더 도와드리겠습니다.

YANG MINJI님의 프로필

YANG MINJI

질문자

2021.05.29

감사합니다! 혹시 결과페이지에

'세부결과' 까지는 냈는데..

세부결과 밑 표시해둔 노란쪽에

세부결과

쥐 : 5 / 소: 6 / 호랑이 : 2 / 토끼: 5 / 용: 10

이렇게 앞에 5개만 결과 값을 표기하려면 어떤코드를 써야할까요..?ㅜㅜ

번거롭게 해드려 죄송합니다...

 

0

먼저 개발자 도구에서 값이 출력되는 것은 console.log로 저희가 의도적으로 값을 출력했기 때문입니다.

어떤 데이터를 console로 출력하셨을까요?.

YANG MINJI님의 프로필

YANG MINJI

질문자

2021.05.31

테스트 후 console.log(select)를 쳤을때  나오는 값입니다

그러니까.. 테스트참여자가 테스트를했을때 각 판별값마다(쥐, 돼소,호랑이 토끼 ) 누른 횟수입니다

ex ) [1,3,2,5] = [쥐, 소, 호랑이, 토끼 누른 값]

여기서 1,3,2,5 이 값을 결과페이지 하단에 따로 보여주고싶습니다!

한가지만 더 여쭙고 싶습니다.

제가 이전에 답변드린 내용이랑 어떤 차이가 있을까요?

YANG MINJI님의 프로필

YANG MINJI

질문자

2021.05.31

심리테스트의 목적은 엑셀로 받던 설문지와 답변을

쉽고 편하게 테스트 받을수 있는게 하는게 목적이었고,

실제 필요한건 세부 데이터 였습니다.

어떤걸 많이 선택하느냐도 중요하지만,

다른값도 얼마나 선택했느냐에 따라서 사람에 대한 해석이 달라질수 있어서요.

가장 큰순서 대로 배열하지 않고,

0번결과(예시에서는 쥐) 몇개, 1번(소) 몇개, 3번(호랑이) 몇개, 4번(토끼) 몇개  해서

항목 순서대로

0, 0, 0, 0 

식으로 밑에 값이 나와서 테스트대상자가 결과 밑에 나온 값을 저희에게 순서대로 알려주기위함이었습니다..  

너무 어려운 요청이라면 패스하셔도 됩니다 ㅠㅠ 늦은 밤까지 정말 죄송합니다.

아닙니다!

의도하신 부분은 충분히 알았습니다.

어려운 사안도 아니니 걱정하지 마세요 :)

지금 제가 올려드린 코드는,

상위 다섯개의 선택을 보여주는데

모든 선택에 대하여 결과를 취합하고 싶으시단 뜻일까요?

YANG MINJI님의 프로필

YANG MINJI

질문자

2021.06.01

네, 현재 제가 만든 코드는, 

결과가 4개로 만들어봤습니다.

이 결과를 취합해서 보고싶습니다 ! 

그림으로 그리자면

이런느낌일것 같습니다

[ 5, 5, 2, 6] 은 순서대로 결과항목에대해 몇번이나 눌렀나에 대한 결과값이고

결과값 복사하기는 클릭하면 옆에 있는 [ 5, 5, 2, 6 ](결과값)이 복사되는 버튼을 구현하고싶습니다 

조금의 힌트나 방향을 알려주셨으면 좋겠습니다

정말 감사합니다 (_   _  )