Сортировать массив по ключевому слову для поиска - Javascript - PullRequest
0 голосов
/ 10 января 2020

Мне нужно отсортировать массив javascript в результатах поиска по ключевому слову, которое мы искали. Например:

var profile = [
{name: 'Arjun', age: 10},
{name: 'Manu', age: 12},
{name: 'Lipin', age: 15},
{name: 'Anu', age: 11},
{name: 'Anupama', age: 21},
{name: 'Jijo', age: 34}
];

И если ключевое слово для поиска "Anu". Я хочу получить результат следующим образом.

[
{name: 'Anu', age: 11},
{name: 'Anupama', age: 21},
{name: 'Manu', age: 12}
]

То есть мне нужно отфильтровать массив и отсортировать результат по ключевому слову.

Ниже приведен код, который я пробовал. Поиск работает нормально. Как мне выполнить фильтрацию по ключевому слову для поиска?

var profile = [
{name: 'Arjun', age: 10},
{name: 'Manu', age: 12},
{name: 'Lipin', age: 15},
{name: 'Anu', age: 11},
{name: 'Anupama', age: 21},
{name: 'Jijo', age: 34},
{name: 'Abhiram', age: 22},
{name: 'Ram', age: 20},
{name: 'Ram Gopal', age: 21},
{name: 'Ramachandran', age: 20},
{name: 'Sreeram', age: 19},
];

beneficiaryname = "Anu";
result = profile.map(function(item, index){
	var existingname = 1;
	var row_ben_name = item.name;
	existingname = row_ben_name.toLowerCase().search(beneficiaryname.toLowerCase()) !== -1;
	if (existingname){
		return item;
	}
});
result = result.filter(function( element ) {
   return element !== undefined;
});
console.log(result);

ПРИМЕЧАНИЕ. Я хочу отсортировать массив по ключевому слову поиска. Не по умолчанию сортировка AZ.

ОБНОВЛЕНИЕ:

Для большей ясности я обновил свой вопрос, добавив больше данных и ожидаемых результатов.

Если я поиск с другим ключевым словом "Ram". Мне нужен следующий результат.

[
{name: 'Ram', age: 20},
{name: "Ram Gopal", age: 21},
{name: "Ramachandran", age: 20},
{name: "Abhiram", age: 22},
{name: "Sreeram", age: 19}
]

См. Ожидаемый выше результат отсортирован по ключевому слову в поиске. То есть в отсортированном результате сначала нужно отсортировать точный результат поиска, затем ключевое слово сначала в строке, затем в любом месте внутри, затем в конце строки. Я надеюсь, что у всех есть проблема.

Ответы [ 4 ]

3 голосов
/ 10 января 2020

Вы можете достичь того же, написав код следующим образом

Я обновил код после дополнительных разъяснений в вашем вопросе

var profile = [
    {name: 'Arjun', age: 10},
    {name: 'Manu', age: 12},
    {name: 'Lipin', age: 15},
    {name: 'Anu', age: 11},
    {name: 'Anupama', age: 21},
    {name: 'Jijo', age: 34},
    {name: 'Abhiram', age: 22},
    {name: 'Ram', age: 20},
    {name: 'Ram Gopal', age: 21},
    {name: 'Ramachandran', age: 20},
    {name: 'Sreeram', age: 19},
    ];

let keyword = 'Ram';

let search_results = profile
    .filter(prof => {
        // Filter results by doing case insensitive match on name here
        return prof.name.toLowerCase().includes(keyword.toLowerCase());
    })
    .sort((a, b) => {
        // Sort results by matching name with keyword position in name
        if(a.name.toLowerCase().indexOf(keyword.toLowerCase()) > b.name.toLowerCase().indexOf(keyword.toLowerCase())) {
            return 1;
        } else if (a.name.toLowerCase().indexOf(keyword.toLowerCase()) < b.name.toLowerCase().indexOf(keyword.toLowerCase())) {
            return -1;
        } else {
            if(a.name > b.name)
                return 1;
            else
                return -1;
        }
    });

console.log(search_results);
2 голосов
/ 10 января 2020

Можете ли вы попробовать приведенный ниже код, я добавил только для сортировки раздел

var profile = [
{name: 'Arjun', age: 10},
{name: 'Manu', age: 12},
{name: 'Lipin', age: 15},
{name: 'Anu', age: 11},
{name: 'Anupama', age: 21},
{name: 'Jijo', age: 34},
{name: 'Abhiram', age: 22},
{name: 'Ram', age: 20},
{name: 'Ram Gopal', age: 21},
{name: 'Ramachandran', age: 20},
{name: 'Sreeram', age: 19},
];

beneficiaryname = "Ram";
result = profile.map(function(item, index){
	var existingname = 1;
	var row_ben_name = item.name;
	existingname = row_ben_name.toLowerCase().search(beneficiaryname.toLowerCase()) !== -1;
	if (existingname){
		return item;
	}
});
result = result.filter(function( element ) {
   return element !== undefined;
});
//console.log(result);

result.sort((a,b) => {
a = a.name.toLowerCase();
b = b.name.toLowerCase();
var an = a.indexOf(beneficiaryname.toLowerCase());
var bn = b.indexOf(beneficiaryname.toLowerCase());
//console.log(an);console.log(bn);
if(an === bn)
  return (a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0);
else
  return  an > bn ? 1 : -1;

  }); 
  console.log(result);
1 голос
/ 10 января 2020

Используйте decorate-sort-undecorate , чтобы создать массив, содержащий строку, которую вы sh сортируете для каждого объекта. Затем вы сортируете, используя ключ. После этого вы извлекаете объект из этого массива.

var profile = [ {name: 'Arjun', age: 10}, {name: 'Manu', age: 12}, {name: 'Lipin', age: 15}, {name: 'Anu', age: 11}, {name: 'Anupama', age: 21}, {name: 'Jijo', age: 34}, {name: 'Abhiram', age: 22}, {name: 'Ram', age: 20}, {name: 'Ram Gopal', age: 21}, {name: 'Ramachandran', age: 20}, {name: 'Sreeram', age: 19}, ],
  keyword = 'Ram',
  matchWord = keyword.toLowerCase(),
  result = profile
              .map(o => [o.name.toLowerCase(),o])
              .filter(([name]) => name.includes(matchWord))
              .sort(([a], [b]) => a.indexOf(matchWord) - b.indexOf(matchWord))
              .map(([,o]) => o);

console.log(result);

Вы можете array#filter на name и затем лексикографически отсортировать его, используя array#sort для вашего ключевого слова.

var profile = [ {name: 'Arjun', age: 10}, {name: 'Manu', age: 12}, {name: 'Lipin', age: 15}, {name: 'Anu', age: 11}, {name: 'Anupama', age: 21}, {name: 'Jijo', age: 34}, {name: 'Abhiram', age: 22}, {name: 'Ram', age: 20}, {name: 'Ram Gopal', age: 21}, {name: 'Ramachandran', age: 20}, {name: 'Sreeram', age: 19}, ],
  keyword = 'Ram',
  result = profile.filter(o => o.name.toLowerCase().includes(keyword.toLowerCase()))
                  .sort((a, b) => a.name.toLowerCase().indexOf(keyword.toLowerCase()) - b.name.toLowerCase().indexOf(keyword.toLowerCase()));

console.log(result);
1 голос
/ 10 января 2020

let prof = [{name:"Arjun",age:10},{name:"Manu",age:12},{name:"Lipin",age:15},{name:"Anu",age:11},{name:"Anupama",age:21},{name:"Jijo",age:34},{name:"Abhiram",age:22},{name:"Ram",age:20},{name:"Ram Gopal",age:21},{name:"Ramachandran",age:20},{name:"Sreeram",age:19}]

srch = "Ram"

let res = prof.filter(el => new RegExp(srch,"ig").test(el.name)).sort((a,b) => {
    let re = new RegExp("^"+srch, "i")
    return re.test(a.name) ? re.test(b.name) ? a.name.localeCompare(b.name) : -1 : 1
})

console.log(res)
...