4

创建一个在您键入时显示结果的 Web 组件。目前我有如下字符串列表:

[
  'Aaeaca Bi',
  'Aegaca Bd',
  'Biah gi',
  'dBciag ch',
  'Ghiad dl',
]

要在用户键入“B”时进行搜索,目前我得到的结果如下:

'Aaeaca Bi',
'Aegaca Bd',
'Biah gi',
'dBciag ch'

但我想要:

'Biah gi',
'dBciag ch',
'Aegaca Bd',
'Aaeaca Bi',

我想获得搜索结果,优先考虑更接近起始索引的结果。

我该如何解决这个问题?

4

1 回答 1

4

indexOf字符串的差异排序以在数组项中查找:

const arr = [
  'Aaeaca Bi',
  'Aegaca Bd',
  'Biah gi',
  'dBciag ch',
  'Ghiad dl',
  'xxxx',
];
const strToFind = 'B';
const result = arr
  .filter(str => str.includes(strToFind))
  .sort((a, b) => a.indexOf(strToFind) - b.indexOf(strToFind))
console.log(result);

在这种情况下可能无关紧要(对于给定的一段代码,性能很少这样做),但是您可以将计算复杂度降低到O(n)而不是O(n log n)使用计数排序而不是内置的.sort.

如果希望搜索不区分大小写,则将初始数组变为一个同时包含小写版本和原始版本的数组,然后通过检查小写版本进行操作,并在最后映射到原始版本:

const arr = [
  'Aaeaca Bi',
  'Aegaca Bd',
  'Biah gi',
  'dBciag ch',
  'Ghiad dl',
  'xxxx',
  'aabaa'
];
const casedArr = arr.map(str => [str.toLowerCase(), str]);
const strToFind = 'B'.toLowerCase();
const result = casedArr
  .filter(([str]) => str.includes(strToFind))
  .sort((a, b) => a[0].indexOf(strToFind) - b[0].indexOf(strToFind))
  .map(([, origCasedStr]) => origCasedStr);
console.log(result);

于 2019-08-08T05:15:50.380 回答