admin管理员组文章数量:1425790
I need to sort an array by the following order based on a search term.
- Exact string.
- Starts with.
- 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);
I need to sort an array by the following order based on a search term.
- Exact string.
- Starts with.
- 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?
Share Improve this question edited Jan 17, 2019 at 13:12 Nina Scholz 387k26 gold badges364 silver badges414 bronze badges asked Jan 17, 2019 at 12:33 undefinedundefined 6,91413 gold badges53 silver badges102 bronze badges 3-
You have to pare
a
andb
. Your current algorithm just returns-1
or0
for all your array elements. – str 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 also1
. 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 outes. – VLAZ 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. – VLAZ Commented Jan 17, 2019 at 12:41
1 Answer
Reset to default 9You 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 pareWith = 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 = pareWith(term);
array.sort((a, b) => order(a) - order(b));
console.log(array);
本文标签: javascriptJS sort array by three types of sortingStack Overflow
版权声明:本文标题:javascript - JS sort array by three types of sorting - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1745401264a2657049.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论