정보
-
업무명 : 자바스크립트 JSON 문자열에 대한 다양한 처리 방법
-
작성자 : 이상호
-
작성일 : 2020-05-02
-
설 명 :
-
수정이력 :
내용
[개요]
-
안녕하세요? 웹 개발 및 연구 개발을 담당하고 있는 해솔입니다.
-
자바스크립트 (Java Script)를 자유롭게 사용하기 위해서는 해결 방법을 기억할 필요가 있습니다.
-
해결 방법은 어떤 방법으로도 대부분 원하는 결과를 얻을 수 있습니다.
-
그러나 그 중에서도 단순하고 읽기 쉽고 유용한 해결책은 존재합니다.
-
오늘 포스팅에서는 자바스크립트 JSON 문자열에 대한 다양한 처리 방법을 소개해 드리고자 합니다.
[특징]
-
웹 개발을 위해서 자바스크립트 (Java Script)기술이 요구되며 이 프로그램은 이러한 목적을 달성하기 위한 기술서
[기능]
-
JSON 형식 문자열 자료
-
JSON 자료 처리
-
제어 구문 해결
-
배열의 항목 확인
-
문자열로 처리
-
reduce 이용
-
filter 이용
-
배열의 새로운 메서드를 사용
[활용 자료]
-
없음
[자료 처리 방안 및 활용 분석 기법]
-
없음
[사용법]
-
없음
[사용 OS]
-
Windows 10
[사용 언어]
-
Java Script
-
Visual Studio Code v1.43.2
세부 내용
[JSON 형식 문자열 자료]
-
JSON 구조는 다음과 같이 id 및 name은 속성을 가진 객체의 배열이 있습니다.
-
이러한 JSON 구조를 이해하기 위해서 간단한 시나리오를 진행할 예정입니다.
-
즉 id에 해당하는 인덱스를 입력할 경우 name를 반환하는 staff 함수를 작성합니다. 만약 해당 id이 있는 사람이없는 경우 null를 표시합니다.
[
{ "id":1, "name":"홍길동1" },
{ "id":2, "name":"홍길동2" },
...
]
staff(1); // 홍길동1
staff(5); // 홍길동2
staff(999); // null
[JSON 자료 처리]
-
소스 코드를 실행하면 작동되나 몇가지 문제 존재합니다.
-
불필요한 처리 존재
-
var dataJson = data.replace(/'/g, "");와 같이 필요한 코드 존재합니다.
-
이는 원본 데이터에서 전체 치환하여 제거하나 원본 데이터는 ''가 존재하지 않습니다.
-
-
배열의 순서에 따라 Name 추출
-
이 예제 데이터의 경우 우연히 배열 순서와 id 번호가 +1 하는 것만으로 일치합니다.
-
따라서 문제없이 실행되나 데이터의 id가 없거나 순서가 변경되면 잘못된 데이터가 추출합니다.
-
즉 배열의 7번째에 있는 사람과 id가 7번 사람은 다르다.
-
-
없을 경우 Null 처리
-
사용자가 없을 경우 null 대신 문자열의 'null'으로 반환합니다.
-
또한 사용자 요구사항에 따라 문자열로 반환이 올바른 경우도 있으니 주의가 필요합니다.
-
var dataJson = data.replace(/'/g, "");
// console.log(dataJson);
var staffsData = JSON.parse(dataJson);
// console.log(staff[0].id);
// console.log(staff.length);
var staffNumber = staffsData.length;
function staff(id){
if (id >= 1 && id <= staffNumber){
console.log(staffsData[id-1].name);
} else {
console.log('null');
}
}
[제어 구문 해결]
-
제어 구문을 이용한 코드로 일반적인 방법으로 memo는 임시 변수를 사용 거기에 대응하는 id의 사람이 있으면 임시 저장합니다.
-
이 경우 memo 변수가 값이 없는 경우 (undefined) 해당 id가 없는 것으로 판단합니다.
-
문제를 지적하면 memo 변수명이 무엇을 의도하는 지 알기 어렵기 때문에 staffName 변수명과 같은 내용에 맞는 변수명이 좋습니다.
-
자바스크립트 입문 도서에서도 이러한 방법이 많습니다.
-
for문 및 if문의 조합으로 대부분의 문제는 해결할 수 있으나 복잡한 문제일수록 읽기가 어렵습니다.
var staffData = JSON.parse(data);
var staffNumber = staffData.length;
// console.log(staffNumber);
function staff(id){
var memo;
for (var i = 0; i < staffNumber; i++){
// console.log('id :' + staff[i].id + 'name:' + staff[i].name);
if ( staffData[i].id === id ){
console.log(staffData[i].name);
memo = staffData[i].name;
}
}
if (memo == undefined){
console.log('null');
}
}
[배열의 항목 확인]
-
JSON을 파싱하고 배열에 some를 사용하고 있습니다. some 인수로 전달된 함수에서 true 또는 false 판정 결과를 반환합니다.
-
이것을 사용하여 staff의 인수로 전달된 id가 data에 포함 여부를 판정하고 포함할 경우 이름을 출력합니다.
var staff = function (id) {
var called = JSON.parse(data).some(function (person) {
if (person.id === id) {
console.log(person.name);
return true;
}
});
if (!called) {
console.log(null);
}
}
[문자열로 처리]
-
데이터를 JSON.parse 하지 않고 문자열 그대로 처리하고 있습니다.
-
정규식 부분에서 문자로 id 일치하고 name에 매치한 문자열을 표시하고 있습니다.
-
JSON 데이터의 경우 처리 과정에서 성능 저하는 없으나 HTML의 DOM 조작 성능으로 문제가 되면 문자열로 처리함으로써 개선할 수 있습니다.
-
또한 판정 결과에 대한 null 처리는 삼항 연산자를 사용하고 있습니다. 이러한 간단한 조건 분기는 삼항 연산자를 사용하면 깔끔하게 쓸 수 있습니다.
function staff(id) {
var reg = new RegExp('"id":'+id+',"name":"([^"]*)"',"i");
var match = data.match(reg);
console.log( match ? match[1] : null );
};
[reduce 사용]
-
우선 mapById 객체는 JSON을 파싱하고 배열로부터 reduce를 사용하여 생성합니다. 즉 item 데이터를 누적하여 하나의 값으로 배열을 생성합니다.
-
reduce는 2번째 인자를 지정하면 그 값을 초기 값으로 순서대로 배열 값을 처리해 나갈 수 있습니다. 즉 생성된 객체는 다음과 같은 id를 속성 이름과 객체입니다.
-
이 경우 staff 함수 내에서 id에 대응하는 데이터를 특정하는 것이 간단합니다.
-
또한 미리 개체를 생성함으로써 매번 JSON을 구문 분석할 필요가 없기 때문에 그만큼 처리가 가볍게 끝날 것입니다.
var mapById = JSON.parse(data).reduce(function(map, item) {
map[item.id] = item;
return map;
}, {});
function staff(id) {
return mapById[id] ? mapById[id].name : null;
}
console.log(staff(1));
[filter 이용]
-
배열의 filter는 전달된 함수를 사용하여 조건 판정 (true, false)을 합니다. 즉 filter를 통해 id가 일치하는 항목을 추출하여 1번째를 사용하여 판정을 실시하고 있습니다.
-
실무에서는 이러한 배열에 대한 조작이있는 경우 Underscore.js를 사용하는 경우가 많습니다.
function staff(id) {
var person = JSON.parse(data).filter(function(v){
return v.id === id
})[0];
return person ? person.name : null;
}
-
_.findWhere는 조건으로 객체를 전달 일치했지만 1번째를 반환하는 함수입니다.
-
처리의 흐름은 앞서의 filter를 사용한 경우와 같이 해당하는 사람만 필터링하고 그 결과를 바탕으로 판정합니다.
function staff(id) {
var person = _.findWhere(JSON.parse(data), {id: id});
return person ? person.name : null;
}
[배열의 새로운 메소드를 사용]
-
이번에 소개한 some, reduce, filter는 IE9 이상에서만 지원하지 않습니다.
-
따라서 앞서 소개한 Underscore.js에 포함되어있는 _.some, _.reduce, _.filter을 사용하면 오래된 브라우저에도 대응할 수 있습니다.
-
또한 그 외에도 _.findWhere 같은 배열 작업에 대한 유용한 기능을 사용할 수 있습니다.
function staff(id) {
var person = _.findWhere(JSON.parse(data), {id: id});
return person ? person.name : null;
}
요약
-
같은 문제도 여러 해결 방법이 있으며 각 방법도 장점과 단점이 존재합니다. 이번에 소개한 방법 이외에도 좋은 해결 방법이 있다고 생각합니다.
-
많은 방법을 알기위한 실제 프로그램 중 적절한 방법을 선택할 수 코드를 쓸 수 있습니다. 프로그램을 쓸 사람은 많은 해결 방법 중에서 적절한 방법을 선택합니다.
-
문제 해결 패턴 (해법)을 많이 알고 있고 이를 구현하는데 조금이라도 도움이 되었으면 좋겠습니다.
참고 문헌
[논문]
- 없음
[보고서]
- 없음
[URL]
- 없음
문의사항
[기상학/프로그래밍 언어]
- sangho.lee.1990@gmail.com
[해양학/천문학/빅데이터]
- saimang0804@gmail.com
본 블로그는 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
'프로그래밍 언어 > Front End' 카테고리의 다른 글
[Ajax] 에이잭스 비동기 통신 기술 소개 및 예시 (0) | 2023.05.17 |
---|---|
[Java Script] JavaScript를 Chrome 브라우저에서 디버깅하는 방법 (0) | 2020.08.17 |
[Java Script] Java Script를 조작하는 방법과 console.log의 확인 방법 (0) | 2020.08.11 |
[Java Script] 자바스크립트 추천 라이브러리 : Moment.js (0) | 2020.05.02 |
최근댓글