用三种排序方法对JS数组进行排序

4

我需要根据搜索词按以下顺序对数组进行排序。

  1. 完全匹配的字符串。
  2. 以...开头的字符串。
  3. 包含的字符串。

代码:

var arr = ['Something here Hello', 'Hell', 'Hello'];

var term = 'Hello';

var sorted = arr.slice().sort((a, b) => {
  let value = 0;

  if (a.startsWith(term)) {
    value = -1;
  }

  if (a.indexOf(term) > -1) {
    value = -1;
  }

  if (a === term) {
    value = -1;
  }

  return value;
});

console.log(sorted);

预期结果为:
["Hello", "Hell", "Something here Hello"]

我不确定如何使用内置的排序函数来完成这个任务,因为它似乎不适用于这种情况。请问有什么建议吗?


你需要比较变量ab。你当前的算法对于数组中的所有元素只返回-10 - str
因为它看起来不适用于这种情况,所以似乎存在更大的问题(也许是您问题的核心)是您的排序函数返回了不符合逻辑等价性的结果!您应该返回-101。现在您只返回两个值中的一个 - 两个对象相等或较小。从功能上讲,与返回布尔值相同,因为您仍然只有两种结果。 - VLAZ
@str 如果该术语无法找到,它也会返回“0”。这并不能使它更好。 - VLAZ
1个回答

9
您需要一个返回分级排序值的函数。
在排序的回调函数内部,您需要返回两个值之间反映关系的差值。

const compareWith = term => string => {
        if (string === term) return 1;
        if (term.startsWith(string)) return 2; // switch string and term
        if (string.includes(term)) return 3;   // use includes
        return Infinity;                       // unknown strings move to the end
    };

var array = ['Something here Hello', 'Hell', 'Hello'],
    term = 'Hello',
    order = compareWith(term);

array.sort((a, b) => order(a) - order(b));

console.log(array);


谢谢!我感激你的帮助。 - undefined
1
这个答案简直神了,我太喜欢它了。 - Alexandre Elshobokshy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接