일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 공부
- underbar
- JS
- 알고리즘
- 코딩
- 해커톤
- JavaScript
- nqueens
- 제일어려워
- 개발
- method
- 취업
- DOM
- 클라이언트
- this
- Instantiation Patterns
- 리액트
- underscores
- grpahQL
- 엔퀸즈
- 포스기
- 자바스크립트
- 일상
- react
- 연습
- array
- 코드스테이츠
- ftech
- vscode
- 초보
- Today
- Total
analogcoding
Array Method - 이해하기 + 본문
지난번에 이어 underscore 형식의 메소드를 작성해본다.
_.uniq
말 뜻 그대로 유니크한, 중복되지 않는 것만 가려내서 리턴한다.
// Ex) let arr = [1,1,2,2,3,4,3] => [1,2,3,4]
_.uniq = function(array) {
let result = [];
for(let i = 0; i < array.length; i++){
if(!result.includes(array[i])){
// 빈 배열이 array[i]를 포함하고 있는지 없는지 확인하면서 집어넣음으로 중복을 제거.
result.push(array[i])
}
}
return result;
}
_.contains
주어진 인자가 node 의 자손인지, 아닌지에 대해 Boolean 값으로 리턴한다.
_.contains = function(collection,target){
for(let i = 0; i < collection.length; i++){
if(collection[i]===target){
return true;
}
}
for(let key in collection){
if(collection[key]===target){
return true;
}
}
return false;
}
_.extend
주어진 다수의 객체를 하나로 합친다. 객체가 동일한 프로퍼티를 가지게 되는 경우 나중에 오는 값이 최종값으로 남아 리턴된다.
_.extend = function(obj){
for(let i = 0; i < arguments.length; i++){
// 다수의 obj에 접근하기 위해 arguments[i]를 구한다.
for(let key in arguments[i]){
arguments[0][key] = arguments[i][key]
// 맨 앞 객체의 프로퍼티의 값을 나중에 오는 값으로 덮어쓴다.
}
}
return arguments[0]
}
_.defaults
주어진 다수의 객체에서 없는 프로퍼티는 추가하고 동일한 프로퍼티의 경우 먼저 있던 값을 최종값으로 리턴한다.
_.defaults = function(obj){
for(let i = 0; i < arguments.length; i++){
for(let key in arguments[i]){
if(!obj.hasOwnProperty()){
// obj가 프로퍼티를 가지고 있지 않다면 값을 대입한다.
obj[key] = arguments[i][key]
}
}
}
return obj;
}
_.delay ( setTimeOut )
주어진 시간이 만료된 뒤 지정된 함수나 코드를 실행하는 타이머를 설정한다.
delay 는 타이머가 지정된 함수나 코드를 실행시키기 전에 기다려야할 ms(1000분의 1초). 생략 시 0의 값으로 사용된다.
_.delay = function(func,wait){
let args = [...arguments].slice(2);
// 타이머가 만료되고 func에 전달되는 추가적인 매개변수
setTimeOut(function(){
func(..args)},wait);
// 실행될 함수 , 시간
};
_.once
실행된 함수가 다른 값을 받아도 첫번 째로 실행된 값을 계속 리턴한다.
_.once = function(func){
let result;
let firstCall = false;
// firstCall의 값을 바꿔서 더 이상 다른 값을 받아드리지 못하게 함
return function(){
if(!fristCall){
result = func(...arguments)
firstCall = true;
}
return result;
}
}
_.flatten
모든 하위 배열 엘리먼트를 지정된 깊이까지 재귀적으로 이어붙여 새로운 배열을 생성한다.
_.flatten = function(nestedArray,result){
var result = [];
// let 을 쓰면 Identifier 'result' has already been declared 오류가 난다.
for(let i = 0; i < nestedArray.length; i++){
if(!Array.isArray(nestedArray[i])){
result.push(nestedArray[i])
// nestedArray의 각 요소가 배열에 들어있지 않으면 result에 push.
}
else{
result = result.concat(_.flatten(nestedArray[i]))
// result에 배열에 든 nestedArray[i]를 재귀적으로 concat해서 []를 없앤다.
}
}
return result;
}
_.shuffle
배열의 요소를 원래 순서가 아닌 다른 순서로 새 배열에 리턴한다.
// 원 배열과 다른 새 배열을 만드는데 2가지 방법을 사용했다.
// 1. 순서만 바꾸는 방법
_.shuffle = function(array){
let copy = Array.prototype.slice.call(array);
// 원 배열에 영향을 주지 않기 위해 복사본 copy 생성.
let result = [];
for(let i = 1; i < copy.length; i++){
result.push(copy[i]);
}
result.push(copy[0])
return result;
}
// 2. 요소를 랜덤으로 다시 넣는 방법
_.shuffle = function(array){
let copy = Array.prototype.slice.call(array);
for(let i = 0; i < copy.length; i++){
copy[i] = array[Math.floor(Math.random() * array.length)]
// copy의 요소에 같은 요소를 가진 array의 값을 반복적으로 넣어준다.
for(let j = 0; j < i; j++){
if(copy[j]===copy[i]){
i--;
// 들어온 값이 같을 경우 다시 i--를 통해 다시 증감식으로 이동.
}
}
}
return copy;
};
// for문의 작동 순서 1.초기화 2.조건 3.실행 4.증감식
다른 효율적인 방법도 많을 것이고 내 코드가 잘못 작성됬다고 생각할 수 있는 부분이 많을 것이다.
아직 많이 부족하고 그나마 가장 익숙한 if 와 for 처럼 기본적인 방법으로 풀어내보았다.
아직 많이 부족한 내가 더 효율적이고 모든 testcase에 작동하는 코드를 작성하기 위해
앞으로 계속 연습하며 내가 언제든 참조할 수 있게 적어놓았다.
'Study JS for me > Array Method' 카테고리의 다른 글
Array Method - 이해하기 (0) | 2019.04.23 |
---|---|
Array Method -2 (1) | 2019.04.22 |
Array method - 1 (0) | 2019.04.21 |