Я делаю поисковик с Angularjs и хочу показать результаты по совпадению, как поиск в Google, но в настоящее время я получаю только значения из источника данных, и это не ordening, у меня есть это код фильтра:
var datoFiltro = this.filter;
var dataFull = this.data;
var filteredTitle = dataFull.filter(function(item) {
if (datoFiltro && datoFiltro.length) {
var words = datoFiltro.split(" ").filter(function(word) {
return word.length >= 3;
});
var pattern = "(?<=^|\\s)(" + words.join("|") + ")";
var re = new RegExp(pattern, "gi");
return re.test(item.titulo);
}
return true;
});
var filteredCat = dataFull.filter(function(item) {
if (datoFiltro && datoFiltro.length) {
var words = datoFiltro.split(" ").filter(function(word) {
return word.length >= 3;
});
var pattern = "(?<=^|\\s)(" + words.join("|") + ")";
var re = new RegExp(pattern, "gi");
return re.test(item.nombreCategoria);
}
return true;
});
var filteredDesc = dataFull.filter(function(item) {
if (datoFiltro && datoFiltro.length) {
var words = datoFiltro.split(" ").filter(function(word) {
return word.length >= 3;
});
var pattern = "(?<=^|\\s)(" + words.join("|") + ")";
var re = new RegExp(pattern, "gi");
return re.test(item.descripcion);
}
return true;
});
var resultado = filteredCat.concat(filteredTitle, filteredDesc);
var q = [...new Map(resultado.map(obj => [JSON.stringify(obj), obj])).values()];
return q;
Тем не менее, этот поиск будет хорошо выполнен с использованием этого примера данных:
dataFull =[
{
id: 721,
titulo: "Cotizador Gastos Médicos Bx+ 2019",
descripcion: "Cotizador Gastos Médicos Bx+ Tarifas 2019",
updateDate: "2020-03-25 14:30:22.0",
idCategoria: "1",
},
{
id: 88,
titulo: "Cotizador GMM Colectivo",
descripcion: "Cotizador GMM Colectivo",
updateDate: "2020-03-25 14:27:43.0",
idCategoria: "1",
},
{
id: 302,
titulo: "Cotizador AP Escolar",
descripcion: "Cotizador Accidentes Personales Escolar",
updateDate: "2020-03-25 14:26:48.0",
idCategoria: "1",
},
{
id: 865,
titulo: "Cotizador Únikuz Bx+",
descripcion: "Cotizador Únikuz Bx+",
updateDate: "2020-03-19 13:14:01.0",
idCategoria: "1",
},
{
id: 381,
titulo: "Cotizador Premia Bx+",
descripcion: "Cotizador Premia Bx+",
updateDate: "2020-01-02 12:27:43.0",
idCategoria: "1",
},
{
id: 89,
titulo: "Cotizador Vida Grupo",
descripcion: "Cotizador Vida Grupo",
updateDate: "2019-12-26 17:20:00.0",
idCategoria: "1",
},
];
Если я ищу "bx + únikuz", он возвращает 3 строки, но моя цель (2 совпадения) находится в 2-й ряд:
Как упорядочить эти результаты по совпадениям?
ОБНОВЛЕНИЕ :
Я изменил код на:
getData: function() {
var datoFiltro = this.filter;
var dataFull = this.data;
var query1 = $filter('filter')(this.data, this.filter);
var acumuladoQuery = [];
if (query1.length > 0) {
} else {
var palabras = datoFiltro.split(/\s+/).filter(function(word) {
return word.length >= 3;
});
for (var x = 0; x < dataFull.length; x++) {
var conteo = 0;
for (var y = 0; y < palabras.length; y++) {
var x1 = dataFull[x];
var y1 = palabras[y];
if (dataFull[x].nombreCategoria.toUpperCase().includes(palabras[y].toUpperCase()) ||
dataFull[x].titulo.toUpperCase().includes(palabras[y].toUpperCase()) ||
dataFull[x].descripcion.toUpperCase().includes(palabras[y].toUpperCase())) {
acumuladoQuery.push(dataFull[x]);
}
if (conteo == palabras.length) {
return acumuladoQuery;
}
}
}
}
var resultado = query1.concat(acumuladoQuery);
var q = [...new Map(resultado.map(obj => [JSON.stringify(obj), obj])).values()];
return q;
}
Теперь я получаю массив с вхождениями, как его отсортировать? Пример:
q = [
{Array1},
{Array3},
{Array3},
{Array3},
{Array2},
{Array2}
];
Я хочу получить:
q1 = [
{Array3},
{Array2},
{Array1}
];