使用搜索关键字对数组进行排序 - Javascript



我需要使用我们搜索的关键字对搜索结果中的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);

注意:我想使用搜索关键字对数组进行排序。不是默认的 A-Z 排序。

更新:

为了更清楚起见,我用更多的数据和预期结果更新了我的问题。

如果我使用另一个关键字"Ram"进行搜索。我需要以下结果。

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

看到上述预期结果与搜索的关键字一起排序。 也就是说,在排序的结果中,首先我们需要对确切的搜索结果进行排序,然后将关键字作为字符串中的第一个关键字,然后在字符串的末尾进行排序。我希望每个人都能解决问题。

您可以通过编写如下代码来实现相同的目的

在您的问题中进行了更多澄清后,我已经更新了代码

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

使用 decorate-sort-uncorate 创建一个数组,其中包含您希望为每个对象排序的字符串。然后使用键进行排序。然后,从该数组中提取对象。

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

您可以在namearray#filter,然后使用关键字上的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);

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)

您可以尝试以下代码吗,我仅添加了排序部分

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

最新更新