찾아내기 - find, find_index, some, every

devjune·2021년 10월 4일

ES5

목록 보기
11/14

find는 배열 안에 있는 값을 특정 조건에 맞는 값을 처음 만났을 때 return하는 함수이며,
find_index함수는 해당하는 값을 처음 만났을 때의 index값을 리턴하는 함수이다.

function _find(list, predi) {
    var keys = _keys(list);
    for (var i = 0, len = keys.length; i < len; i++) {
    	var val = list[keys[i]];
        if (predi(val)) return val;
    }
}

console.log(
  _find(users, function(user) {
    return user.age < 30;
  })
);

find_index

function _find_index(list, predi) {
    var keys = _keys(list);
    for (var i = 0, len = keys.length; i < len; i++) {
        if (predi(list[keys[i]])) return i;
    }
    return -1;
}

find_index와 _get함수를 이용하여 새로운 리턴값을 도출할 수도 있다.

var _get = _curryr(function(obj, key) {
    return obj == null ? undefined : obj[key];
});

console.log(
  _get(_find(users, function(user) {
    return user.age < 30;
  }), 'name');
);

다음은 some과 every함수를 만들텐데, 동작원리는 다음과 같다.

_some([1, 2, 5, 10, 20], function(val) {
  return val > 10;
});  //true

_some([1, 2, 5, 10, 20], function(val) {
  return val % 10;
}); //true

_every([12, 24, 5, 10, 20], function(val) {
  return val > 10;
}); //false

_every([12, 24, 5, 10, 20], function(val) {
  return val > 3;
}); //true

some은 인자로 넘겨지는 함수를 만족하는 값이 하나라도 있으면 true를 반환하고, every는 모든 값이 조건을 만족해야 true를 반환한다.

구현은 다음과 같다.

function _some(data, predi) {
  return _find_index(data, predi) != -1;
}

function _every(data, predi) {
  return _find_index(data, _nagate(predi)) == -1;
}

근데, _some이나 _every 함수는 predi 인자가 없어도 동작을 해야한다. 예를들어,

_some([1, 2, 0, 10]);
_every([1, 2, 0, 10]);

이렇게 해도 동작을 해아한다. _identity 함수를 이용할건데,

_some([1, 2, 0, 10], _identity);

이런식으로 하면 동작이 되는것이다.

function _some(data, predi) {
  predi = predi || _identity;
  return _find_index(data, predi) != -1;
}

function _every(data, predi) {
  predi = predi || _identity;
  return _find_index(data, _nagate(predi)) == -1;
}

좀 더 간결하게,

function _some(data, predi) {
  return _find_index(data, predi || _identity) != -1;
}

function _every(data, predi) {
  return _find_index(data, _nagate(predi || _identity)) == -1;
}
profile
개발자준

0개의 댓글