【问题标题】:How to sort an array using a searched text in javascript?如何使用 javascript 中的搜索文本对数组进行排序?
【发布时间】:2020-02-03 13:24:37
【问题描述】:

我搜索了“hr001”,它返回所有具有“hr001”的索引。还行吧。 但我想使用搜索到的文本(“hr001”)对这个数组进行排序。

查看给定的代码。当我搜索“hr001”时,这里返回该数组的第一个和最后一个元素,数组顺序为:“code”:“SFHR001”,“code”:“HR001”。

由于我搜索“hr001”并且它完全匹配“code”:“HR001”,所以我想显示“code”:“HR001”作为第一个元素

var items = [
    {
        "id": 1,
        "code": "SFHR001",
        "property": "8''",
        "description": "Half Round",
        "productGroup": {
            "id": 2,
            "name": "Steel Files",
        }
    },
    {
        "id": 2,
        "code": "MR004",
        "property": "7''",
        "description": "Polished",
        "productGroup": {
            "id": 3,
            "name": "Pliers",
        }
    },
    {
        "id": 2,
        "code": "HR001",
        "property": "7''",
        "description": "Fine Polished",
        "productGroup": {
            "id": 3,
            "name": "Hand Reveter",
        }
    },
]

search = (item, searchedText) => { 

  return item["code"].toLowerCase().indexOf(searchedText.toLowerCase()) > -1
    
}


var ac = items.filter((item) => {
  return search(item, 'hr001');
});

console.log(ac);

// var sortWithInputText = ac.sort(..........................)

【问题讨论】:

标签: javascript sorting


【解决方案1】:

你需要某种逻辑来决定什么是最接近的,..

一个简单的例子可能是基于长度,所以如果结果长度和搜索词的长度接近,这些会排到顶部。你可以做比这更精彩的评分,但你需要决定这属于什么逻辑。例如。甚至还有一种叫做 soundex 算法的东西,你可能想与它合并等等。https://en.wikipedia.org/wiki/Soundex

但是使用简单的长度测试作为指导,下面是一个简单的例子。如果每个项目的分数相等,它也会回退到简单的字符串比较。

var items = [
    {
        "id": 1,
        "code": "SFHR001",
        "property": "8''",
        "description": "Half Round",
        "productGroup": {
            "id": 2,
            "name": "Steel Files",
        }
    },
    {
        "id": 2,
        "code": "MR004",
        "property": "7''",
        "description": "Polished",
        "productGroup": {
            "id": 3,
            "name": "Pliers",
        }
    },
    {
        "id": 2,
        "code": "HR001",
        "property": "7''",
        "description": "Fine Polished",
        "productGroup": {
            "id": 3,
            "name": "Hand Reveter",
        }
    },
]

search = (item, searchedText) => { 

  return item["code"].toLowerCase().indexOf(searchedText.toLowerCase()) > -1
    
}

const searchTerm = 'hr001';

function score(a) {
  return Math.abs(searchTerm.length - a.code.length);
}


var ac = items.filter((item) => {
  return search(item, searchTerm);
}).sort((a, b) => {
  //sort by score, if equal fall back to compare.
  return score(a) - score(b) ||
    a.code.localeCompare(b.code);
});

console.log(ac);

// var sortWithInputText = ac.sort(..........................)

【讨论】:

    【解决方案2】:

    您似乎正在寻找“按字段排序”功能。

    JS 的Array.prototype.sort 函数接受一个可选参数,即它的“排序算法”。这只是一个函数,它接受 2 个参数,如果第一个参数应该首先被索引,则返回 -1,如果第二个参数应该首先索引,则返回 1,如果它们相等,则返回 0

    https://www.w3schools.com/js/js_array_sort.asp

    function sortObjectByField(a, b, field) {
      if (a[field] < b[field]) {
        return -1;
      }
      if (a[field] > b[field]) {
        return 1;
      }
      return 0;
    };
    
    items.sort((a, b) => sortObjectByField(a, b, 'code'));
    

    【讨论】:

      【解决方案3】:

      试试这个:

      items
      .filter(el => el.code.toLowerCase().indexOf('hr001')>-1)
      .sort((a,b)=> a.code.toLowerCase() < b.code.toLowerCase() ? -1 : 1)
      

      【讨论】:

        猜你喜欢
        • 2020-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多