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;
}