<회고>
오늘도 저번시간에 진행한 언더바에 문제풀이를 하였다. 배열메소드
에 대한 내용과 동기
비동기
개념 그리고 객체의 확장성
에 대해 문제를 해결하며 적용 시켜보았다. 동기 비동기 개념은 오늘 처음 배운 개념이기 때문에 따로 정리 해야할 필요가 있다고 생각이 들었다.
callback
동기 sync
비동기 async
arguments, ...args ,window
배열 또는 객체가 주어진 값을 포함 하는지 체크하는 함수를 만드는 문제입니다.
_.contains = function(collection, target) {
let result = false;
_.each(collection,function(el){
if( el === target){
result = true;
return result;
}
})
return result;
};
이전 each함수를 통해 요소들이 비교 대상과 같으면 true만들도록해서 값이 나오게 구현 하였다.
_.contains = function(collection, target) {
if(Array.isArray(collection)){
for(let i = 0 ; i < collection.length; i++){
if(collection[i] === target){
return true;
}
}
}else {
for(let key in collection){
if(collection[key] === target){
return true
}
}
}
return false;
};
단순하게 for문을 사용하여 배열일때와 객체일때를 나누어 구현 하였다.
모든 요소가 iterator에 의해 값이 전달이 되는지 확인 하는 문제입니다.
_.every = function(collection, iterator) {
if(iterator === undefined){
iterator = _.identity;
}
for(let i =0 ; i < collection.length; i++){
if(!iterator(collection[i])){
return false;
}
}
return true;
};
iterator가 undefined로 되었을때 identity함수를 써 값을 가져와 주었고 나머지는 iterator에 넣어 확인 해 주었습니다.
element가 하나라도 iterator에 의해 truthy한지 체크하는 문제입니다.
_.some = function(collection, iterator) {
return !_.every(collection,function(el){
if(iterator === undefined){
iterator = _.identity;
}
return !iterator(el);
})
};
기존의 every의 값을 부정해주어 문제를 해결했다.
주어진 객체를 전달된 모든 속성으로 확장하는 문제입니다.
_.extend = function(obj) {
for(let i =0 ; i < arguments.length; i++){
for(let key in arguments[i]){
obj[key] = arguments[i][key];
}
}
return obj;
};
obj파라미터가 여러개가 될 수있기때문에 arguments로 여러개의 파라미터를 정해주고 obj객체에 삽입 해주어 문제를 해결했다.
문제를 접근하는데 있어 arguments를 사용하는것을 찾는데 시간이 좀 걸렸고 직접 코드에 직접 적용시키면서 arguments에 대해 이해도를 높였다.
extend와 비슷하지만 이미 존재하는 key 대해 값을 덮어쓰기 하지 않게 구현하는 문제입니다.
_.defaults = function(obj) {
for(let i=0; i < arguments.length; i++){
for(let key in arguments[i]){
if(!obj.hasOwnProperty(key)){
obj[key] = arguments[i][key];
}
}
}
return obj;
};
hasOwnProperty메소드를 사용하여 객체에 키값이 있는지 유무를 판단 한뒤 삽입 처리를 하면서 문제를 해결하였다.
클로저 문제입니다.
_.once = function(func) {
let alreadyCalled = false;
let result;
return function() {
if(alreadyCalled === false){
result = true;
}
return result;
};
};
문제를 접근하는데 있어서 클로저 개념을 적용하였고 사용하면서 클로저에 대한 이해도를 높였다.
원래 함수에 대한 argument는 wait parameter 뒤에 전달되게 만드는 함수입니다.
_.delay = function(func, wait,...args) {
setTimeout(function(){
func(...args);
},wait);
};
setTiemout메소드를 사용하여 동기 비동기을 적용시켰다.
다차원 배열을 가져와 1차원 배열로 반환하는 문제입니다.
_.flatten = function(nestedArray, result) {
return _.reduce(nestedArray, function(acc, val){
if (Array.isArray(val)) {
return acc.concat(_.flatten(val))
}
return acc.concat(val)
},[])
};
reduce 함수와 콜백의 개념을 이용하여 해결 하였다.
_.flatten = function(nestedArray, result) {
let newArr= [];
for(let i =0; i < nestedArray.length; i++){
if(!Array.isArray(nestedArray[i])){
newArr.push(nestedArray[i]);
}else {
newArr = newArr.concat(_.flatten(nestedArray[i]));
}
}
return newArr;
};
콜백을 이용해 해결
_.shuffle = function(array) {
let newArr = [];
let arr = array.slice();
let randomindex = Math.floor(Math.random() * arr.length);
for(let i = 0; i < arr.length; i++){
}
};