в es2015 у массива есть метод find, который принимает в параметрах функцию в которую передает каждый элемент массива, и вернет первый элемент для которого функция вернула true (или undefined если функция не вернула true не для одного элемента)
Для поддержки браузеров без es2015 пишем такой полифил:
if(typeof Array.prototype.find !== 'function') {
Object.defineProperty(Array.prototype, 'find', {
configurable : true,
enumerable : false,
writable : false,
value : function(func) {
if(typeof func !== 'function') {
throw new TypeError('First argument is expected function, ' + typeof func + ' given!');
}
for(var i = 0, n = this.length; i < n; i++) {
if(func(this[i], i, this)) {
return this[i];
}
}
return void 0;
}
});
}
Собственно like можно организовать на базе этого метода:
//Вернет найденое значение
function like(arr, search) {
if(!Array.isArray(arr)) {
throw new TypeError('First argument is expected Array');
}
search = new RegExp(search.toString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'), 'i');
return arr.find(function(el) {
return search.test(el);
});
}
//Вернет индекс
function likeIndex(arr, search) {
if(!Array.isArray(arr)) {
throw new TypeError('First argument is expected Array');
}
var ind;
search = new RegExp(search.toString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'), 'i');
return typeof arr.find(function(el, i) {
ind = i;
return search.test(el);
}) === 'undefined' ? -1 : ind;
}