【问题标题】:Sort array with a search keyword - Javascript使用搜索关键字对数组进行排序 - Javascript
【发布时间】:2020-04-27 17:53:08
【问题描述】:

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

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

【问题讨论】:

  • 这样做profile.filter(x=>x.name.toLowerCase().contains("anu")).sort((a,b) => (a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0));
  • 这几乎是一样的,只是它不过滤掉结果。 stackoverflow.com/questions/26796276/…

标签: javascript arrays json sorting javascript-objects


【解决方案1】:

你可以通过编写如下代码来达到同样的目的

在您的问题得到更多澄清后,我已经更新了代码

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

【讨论】:

  • 这是默认排序,排序函数为 (A - Z)。我想用搜索关键字对数组进行排序。
  • 现在检查这个,我已经按照你的建议更新了代码
  • 谢谢。这正是我所需要的。
  • 太棒了!请将此标记为已接受的答案,以便寻找类似问题的每个人都可以参考。
【解决方案2】:

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)

【讨论】:

  • 这是默认排序,排序函数为 (A - Z)。我想用搜索关键字对数组进行排序。
  • @AdhershMNair 它已根据您的示例进行排序。我想我不明白你的意思。
  • 我将用更多预期结果更新问题。我需要用关键字对答案进行排序。
【解决方案3】:

你能试试下面的代码吗,我只添加了排序部分

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

【讨论】:

  • 这是默认排序,排序函数为 (A - Z)。我想用搜索关键字对数组进行排序。
  • @AdhershMNair 你能用你的问题中的例子或样本数据来解释吗?
  • 当然。我将使用更多数据和预期结果更新问题。
  • 更新了我的问题。
  • @AdhershMNair 更新了我的答案
【解决方案4】:

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

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

您可以在name 上使用array#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);

【讨论】:

  • 但是我需要用搜索到的关键字对数组进行排序。
  • 这是迄今为止最干净的解决方案
猜你喜欢
  • 2021-10-29
  • 2022-01-06
  • 2022-08-21
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多