jquery 基于匹配值的数组重新排序

83qze16e  于 5个月前  发布在  jQuery
关注(0)|答案(1)|浏览(78)

基于匹配值的数组重新排序
数组顺序应该根据用户搜索而改变,匹配的对象优先

let movies = [{
    "MovNameOne": ["comedy", "fun", "2021"]
  },
  {
    "MovNameTwo": ["thriller", "suspense", "2022"]
  },
  {
    "MovNameThree": ["thriller", "comedy", "2021"]
  },
  {
    "MovNameFour": ["action", "mixed", "2000"]
  },
  {
    "MovNameFive": ["fun", "mixed", "2021"]
  },
];

 console.log( movies.sort( () =>  ****  );

字符串
如果用户知道电影的确切全名,那么这个匹配的对象应该是第一位的,用户可以根据随机关键字搜索

flvtvl50

flvtvl501#

为此,您可以使用字符串之间的Levenshtein距离并相应地对它们进行排序。
source code for Leventshtein distance taken from here
Levenshtein距离维基百科

const levenshteinDistance = (s, t) => {
    if (!s.length) return t.length;
    if (!t.length) return s.length;
    const arr = [];
    for (let i = 0; i <= t.length; i++) {
        arr[i] = [i];
        for (let j = 1; j <= s.length; j++) {
            arr[i][j] =
                i === 0
                    ? j
                    : Math.min(
                        arr[i - 1][j] + 1,
                        arr[i][j - 1] + 1,
                        arr[i - 1][j - 1] + (s[j - 1] === t[i - 1] ? 0 : 1)
                    );
        }
    }
    return arr[t.length][s.length];
};

let movies = [{
    "MovNameOne": ["comedy", "fun", "2021"]
},
{
    "MovNameTwo": ["thriller", "suspense", "2022"]
},
{
    "MovNameThree": ["thriller", "comedy", "2021"]
},
{
    "MovNameFour": ["action", "mixed", "2000"]
},
{
    "MovNameFive": ["fun", "mixed", "2021"]
},
];

// a series of test input to check the function

let testInputs = ["MovNameF", "MovN", "MovNameOne", "MovNameFour"];

testInputs.forEach(inp => {
// if levenshtein distance between input and element a is greater than input and element b then sort a after be else sort b after a
// > 0 means sort a after b
// < 0 means sort b after a
    console.log(inp, movies.sort((a, b) => levenshteinDistance(inp, Object.keys(a)[0]) > levenshteinDistance(inp, Object.keys(b)[0]) ? 1 : -1))
})

字符串
您可以在电影类型/关键字上使用相同的逻辑对它们进行相应的排序

相关问题