4

I need to sort an array by the following order based on a search term.

  1. Exact string.
  2. Starts with.
  3. Contains.

Code :

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

The expected result is:

["Hello", "Hell", "Something here Hello"]

I'm not sure how to do this with the built-in sort function because it looks like it's not meant to use with cases like that. Any advice, please?

3
  • You have to compare a and b. Your current algorithm just returns -1 or 0 for all your array elements. Commented Jan 17, 2019 at 12:40
  • because it looks like it's not meant to use with cases like that it looks like a bigger problem (and maybe the core of your problem) is that your sorting function is returning results that are not logically equivalent! You should be returning -1, 0 but also 1. Right now you only return one of two values - two objects are equal or smaller. It's functionally equivalent to returning a boolean as you still only have two outcomes. Commented Jan 17, 2019 at 12:40
  • @str it also returns 0 if the term is nowhere to be found. Not that it makes it better. Commented Jan 17, 2019 at 12:41

1 Answer 1

9

You need a function which returns a value for the staged sorting.

Inside of the callback for sorting, you need to return the delta of the two values which reflects the relation between the two strings.

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

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you! I appreciate your help.
This answer is godlike, I love it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.