2022년까지

배열메서드 - 필터링[1]

줜님 2020. 5. 5. 04:03

배열 필터링에 관여하는 메서드를 꼽으라면 forEach()와 filter()를 들 수 있다.

forEach()와 filter()의 사용법을 우선 간단히 비교해본다.

var singer = [];
var girls = [{name:'아이린',age:29},{name:'슬기',age:26},{name:'웬디',age:26},{name:'조이',age:23},{name:'예리',age:21}];

/* forEach()는 객체나 배열 모두 루프 실행가능하며, 지정된 범위내 값인지 조건검사하여 새로운 배열에 추가함. */
girls.forEach(function(elem){
  if( elem.age >= 23 && elem.age <= 26 ){
    singer.push( elem );
  }
});

/* 간혹 forEach()와 each()를 혼동할 수 있는데, 그 사용법이 약간 다르다. */
/* 아래처럼 사용하는 경우 //girls.each is not a function 라는 콘솔에러가 뜬다. */
girls.each(function(i,v){
  console.log(elem);
});

/* each는 jquery 요소집합만 직접 붙여 사용할 수 있음 */
$('table thead th').each(function(i,v){
  console.log(v);
});

/* 배열이나 객체에 직접 연계해서 쓰려면 $.each(array,function(){ ... }); 으로 사용해야함 */
$.each(girls, function(i,v){
  console.log(v);
});

/* filter()는 true 또는 false를 리턴하며, true 조건에 맞는 아이템을 새로운 배열에 추가함. */
singer = girls.filter(function(elem){
  return ( elem.age >=23 && elem.age <=26 );
});

jqueryUi 컴포넌트인 slider와 배열메서드 forEach()를 사용해서 나이 필터링을 구현해본다.

실행결과이다. 웬디와 예림을 위로 올렸다. 더 아끼니까 :-)

 

See the Pen yLYpYaO by rainydaymusickr (@rainydaymusickr) on CodePen.

<div class="slider">
  <div class="outer">
    <label for="age">나이 필터링</label>
	  <div class="inner">
        <input type="text" id="age" readonly>
          <span class="age-unit">세 이상</span>
        </div>
      </div>
    <div id="slider-vertical" style="height:25px;"></div>
  </div>

<table id="data-table" class="table">
<thead>
  <th>이름</th>
  <th>나이</th>
  <th>혈액형</th>
  <th>사진</th>
</thead>
</table>
:root{font-size:62.5%;}
*{margin:0;padding:0;}
body{font-size:1.6rem;}
img{height:100px;vertical-align:top;transform:scale(2);transition:all .2s ease-in;}
table{width:100%;border-collapse:collapse;border-spacing:0;}
table th{padding:1rem 0;color:#eee;background-color:teal;}
table th+th{border-left:1px solid #eee;}
table td{letter-spacing:-.1rem;text-align:center;border-bottom:1px solid #eee;overflow:hidden;}
table td:nth-child(1){background-color:yellowgreen;}
table td:nth-child(2){background-color:wheat;}
table td:nth-child(3){background-color:pink;}
table td:nth-child(4){background-color:#000;}
table td+td{border-left:1px solid #eee;}
table td:hover img{transform:scale(1.5);}
.slider{margin-bottom:2rem;}
.slider .ui-widget.ui-widget-content{margin:0 70px auto 50px;}
.slider .outer label{display:block;text-align:center;font-size:2rem;padding:1rem 0;}
.slider .outer input{width:calc(50%);height:5rem;text-align:right;font-size:3rem;border:0;}
.slider .inner {position:relative;}
.slider .inner .age-unit{position:absolute;right:0;top:50%;transform:translateY(-50%);width:50%;text-align:left;}
.slider .ui-slider .ui-slider-handle{width:4rem;height:4rem;}
.slider .ui-slider-horizontal .ui-slider-handle{top:-.8rem;}
.slider .ui-widget-header{background-color:#007fff;}
(function($){
  var singer = [];
  var $rows = [];
  var girls = [
	{name:'아이린',	age:29, blood:'A', img:'<img src="https://s3.orbi.kr/data/file/united/4c8ed5bf3e0058c4482b326e60a6541c.gif">' },
	{ name:'슬기',	age:26,	blood:'A', img:'<img src="https://i.imgur.com/c7JA2Hg.gif">'},
	{ name:'웬디',	age:26,	blood:'O', img:'<img src="https://ww.namu.la/s/0dd146e8cfb7d00e71dd298435cbfdf9b7210ecc8017afb19bfab1991ec933c2b618a1175ada15703b9dd929fe99964273c981dd7882ea47f5e6191419d07ebdd4490f2b7e841a5e9b96aa0940bd9845621283b7dfbabc6e5c4a5ec0296099dd">'},
	{ name:'조이',	age:23, blood:'A', img:'<img src="https://i.imgur.com/q94ENR0.gif">'},
	{ name:'예리',	age:21,	blood:'O', img:'<img src="https://w.namu.la/s/89694f2afaca553b215f8d013e758764b636525b89afbd6d7817660e2b45e2f2be9fe91795bbfd71193f44cbbdc861ac27e8fc6541736c1ea3d3079bfd6857e7ce1bc41d751e61a7bc42fa88f4ca5bc1733090a089170128041e16d35d5519e1">'},
	{ name:'사나',	age:23, blood:'B', img:'<img src="https://img1.daumcdn.net/thumb/R720x0.q80/?scode=mtistory2&fname=http%3A%2F%2Fcfile29.uf.tistory.com%2Fimage%2F237910445932AE3127CD04">'},
	{ name:'최예나',	age:20, blood:'A', img:'<img src="https://1.bp.blogspot.com/-n6oCsY3PbTo/XHi8-zqbBNI/AAAAAAAAOgo/g4giWdkfdvwjdzuOQZNqFqtcMO7qa01QQCLcBGAs/s1600/projectgirlgroup-20181104-172511-000.gif">'},
	{ name:'채수빈',	age:25, blood:'A', img:'<img src="https://4.bp.blogspot.com/-1otSJ33_qcQ/W-rTtcA7IWI/AAAAAAABRe0/lVLc6ytNlkcjlEYF1TAVgF1jyi1_aDeRQCLcBGAs/s1600/Honeycam%2B2018-11-13%2B22-37-15.gif">'}, 
	{ name:'박보영',	age:30, blood:'O', img:'<img src="https://2.bp.blogspot.com/-H6pTnlBBe1k/WQsnF-zc59I/AAAAAAAi0PE/Q5zoqgQOfcczewM0xZfjYkdZMxAQhEgXQCLcB/s1600/00.gif">'},
	{ name:'크리스탈',	age:25, blood:'A', img:'<img src="https://2.bp.blogspot.com/-RRYE8CE7Z94/UqV8_nX-MmI/AAAAAAAAAIg/7PutnD9rS5g/s1600/Untitled-5.gif">'}
  ];

  //girls를 테이블로 파싱
  function makeTable(){
	var $table = $('#data-table');
	var $tbody = $('<tbody></tbody>');
		
	girls.forEach(function(elem){
		var $row = $('<tr></tr>');
		$row.append( $('<td></td>').text(elem.name) );
		$row.append( $('<td></td>').text(elem.age) );
		$row.append( $('<td></td>').text(elem.blood) );
		$row.append( $('<td></td>').append(elem.img) );
		$rows.push({
			elem: elem,
			element: $row
		});
	});
	$rows.forEach(function(elem){
		$tbody.append( elem.element );
	});
	$table.append( $tbody );
  }
  makeTable();
	
  //girls data 업데이트
  function updateTable(value){
	$rows.forEach(function(row){
		if( row.elem.age >= value ){
			row.element.show();
		}else{
			row.element.hide();
		}
	});
  }
  updateTable( $("#age").val() );
  
  $( "#slider-vertical" ).slider({
	range: "min",
	min: 20,
	max: 30,
	value: 20,
	slide: function(event, ui) {
		$( "#age" ).val( ui.value );
	},
	change: function(eveny, ui){
		updateTable( ui.value );
	}
  });
  $("#age").val( $("#slider-vertical").slider("value") );
})(jQuery);

'2022년까지' 카테고리의 다른 글

르네 마그리트의 초현실주의  (0) 2020.05.24
배열메서드 - 필터링[2]  (0) 2020.05.05
스쿨존을 뚫어라  (0) 2020.05.05
아이락스 kr-6170  (0) 2020.05.03
마리 앙투아네트  (0) 2020.05.02