Задать вопрос
@MdaUZH

Поиск по похожей строке в массиве js?

Как будет более правильно совершить поиск похожей строки по массиву?

что-то типа '%str%' в LIKE SQL,

find(arr, '%str%') не работает, как быть?

find:
function find(array, value) {
  if (array.indexOf) { // если метод существует
    return array.indexOf(value);
  }

  for (var i = 0; i < array.length; i++) {
    if (array[i] === value) return i;
  }

  return -1;
}

var arr = ["a", -1, 2, "b"];

var index = find(arr, 2);

alert( index );


нагуглить ничего не смог, мб кто-то из вас сталкивался и подскажет как делать?

хотелось бы на чистом js, т.к покачто разбираюсь с ним, и jquery и т.д не использую

Спасибо всем)
  • Вопрос задан
  • 8197 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 2
@GeneD88
QA
1.
Array.prototype.contains = function(element){
return this.indexOf(element) > -1;
};

["toster", "tester", "mister"].contains("toster")
// True

2.
var myArr = ["toster", "tester", "mister"];
var tosterInArray = (myarr.indexOf("toster") > -1);
// True
Ответ написан
Ну например через filter:
var find = function (arr, find) {
  return arr.filter(function (value) {
     return value === find;
  });
};
var arr = ["a", -1, 2, "b"];
console.log(find(arr, -1));
var result = find(arr, 2);

result будет включать все значения удовлетворяющие условию в ф-и, в вашем случаи будет:
[2]
C определением вхождения:
var find = function (arr, find) {
  return arr.filter(function (value) {
     return (value + "").indexOf(find) != -1;
  });
};
var arr = ["a", -1, 2, "bulka"];
console.log(find(arr, "b"));
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
в 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;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы