# 1. 两个字符串相同的最大子串
需求场景:
app、小程序、网页定位中,同一个小区,不同楼栋、门店定位名称不一样,需要从中自动提取小区名称。
案例演示:'华侨国际城','华侨国际城凯佳宾馆' => 提取:华侨国际城 '武汉华侨国际城','解放大道华侨国际城凯佳宾馆' => 提取:华侨国际城 '武汉状元城宾馆','解放大道武汉华侨国际城凯佳宾馆' => 提取:武汉 // 原因:两个地址属于两个小区,向上提取更大范围 “武汉” '武汉华侨国际城4栋','武汉解放大道华侨国际凯佳宾馆' => 提取:华侨国际(便于模糊查询) '华侨国际','武汉解放大道华侨国际凯佳宾馆' => 提取:华侨国际方法:
function getMaxStr(str1,str2){ var max = str1.length > str2.length ? str1 : str2; var min = (max == str1 ? str2 : str1); for(var i = 0; i < min.length; i++){ for(var x = 0, y = min.length - i;y != min.length + 1;x++,y++){ //y表示所取字符串的长度 var newStr = min.substring(x,y); //判断max中是否包含newStr if(max.indexOf(newStr) != -1){ return newStr; } } } return -1; } console.log(getMaxStr('华侨国际城','华侨国际城凯佳宾馆'));//华侨国际城 console.log(getMaxStr('武汉华侨国际城','解放大道华侨国际城凯佳宾馆'));//华侨国际城 console.log(getMaxStr('武汉状元城宾馆','解放大道武汉华侨国际城凯佳宾馆'));//武汉 console.log(getMaxStr('武汉华侨国际城4栋','武汉解放大道华侨国际凯佳宾馆'));//华侨国际 console.log(getMaxStr('华侨国际','武汉解放大道华侨国际凯佳宾馆'));//华侨国际升级方法:
function extractCommunityName(address1, address2) { // 找出两个字符串的最长公共子串 function findLongestCommonSubstring(str1, str2) { let maxLen = 0; let endIndex = 0; let dp = Array.from({ length: str1.length + 1 }, () => Array(str2.length + 1).fill(0)); for (let i = 1; i <= str1.length; i++) { for (let j = 1; j <= str2.length; j++) { if (str1[i - 1] === str2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; if (dp[i][j] > maxLen) { maxLen = dp[i][j]; endIndex = i - 1; } } } } return str1.substring(endIndex - maxLen + 1, endIndex + 1); } // 提取小区名称 const commonSubstring = findLongestCommonSubstring(address1, address2); // 如果公共子串为空,说明两个地址不属于同一个小区,返回更大的范围 if (!commonSubstring) { // 这里可以根据需求返回更大的范围,比如城市名称 return address1.split(' ')[0] || address2.split(' ')[0]; } return commonSubstring; } // 测试案例 console.log(extractCommunityName('华侨国际城', '华侨国际城凯佳宾馆')); // 输出: 华侨国际城 console.log(extractCommunityName('武汉华侨国际城', '解放大道华侨国际城凯佳宾馆')); // 输出: 华侨国际城 console.log(extractCommunityName('武汉状元城宾馆', '解放大道武汉华侨国际城凯佳宾馆')); // 输出: 武汉 console.log(extractCommunityName('武汉华侨国际城4栋', '武汉解放大道华侨国际凯佳宾馆')); // 输出: 华侨国际 console.log(extractCommunityName('华侨国际', '武汉解放大道华侨国际凯佳宾馆')); // 输出: 华侨国际 // 代码说明: // findLongestCommonSubstring:这个函数用于找出两个字符串的最长公共子串。它使用动态规划的方法来求解。 // extractCommunityName:这个函数调用findLongestCommonSubstring来获取两个地址的最长公共子串。如果公共子串为空,说明两个地址不属于同一个小区,返回更大的范围(如城市名称)。 // 注意事项: // 这个方法假设小区名称是地址中最长的公共子串。如果地址中包含其他公共信息(如城市名称),可能需要进一步处理。 // 如果两个地址属于不同的小区,返回更大的范围(如城市名称)。你可以根据实际需求调整这个逻辑。 // 这个方法可以处理大部分情况,但如果地址格式非常复杂,可能需要进一步优化或结合其他方法(如正则表达式)来处理。
# 2. 最近距离排序
需求场景:
需要根据每个人离我的远近依次排序,我们所有人基于同一个参考点
案例演示:我自己距离参考点:500米,其他人距离参考点600米,650米,700米等等, 求此时其他人离我的位置由近及远排序 数据模型: let me = { name:'我', pointer:500 } let orthers = [ { name:'梁咏琪', pointer:550 }, { name:'杨超越', pointer:600 }, { name:'迪丽热巴', pointer:505 }, { name:'古力娜扎', pointer:650 }, { name:'古巨基', pointer:700 }, { name:'刘德华', pointer:451 }, { name:'古天乐', pointer:180 }, ]方法:
function sortPointer(arr,info){ return arr.sort( (a,b)=> Math.abs(a.pointer - info.pointer) - Math.abs(b.pointer - info.pointer) ).map(item => ( { ...item, distance:Math.abs(item.pointer - info.pointer) //距离我多远 } )); } let me = { name:'我', pointer:500 } let orthers = [ { name:'梁咏琪', pointer:550 }, { name:'杨超越', pointer:600 }, { name:'迪丽热巴', pointer:505 }, { name:'古力娜扎', pointer:650 }, { name:'古巨基', pointer:700 }, { name:'刘德华', pointer:451 }, { name:'古天乐', pointer:180 }, ] let resArr = sortPointer(orthers,me); console.log(resArr); //返回 [ { "name": "迪丽热巴","pointer": 505,"distance": 5}, { "name": "刘德华", "pointer": 451,"distance": 49}, { "name": "梁咏琪", "pointer": 550, "distance": 50}, { "name": "杨超越","pointer": 600,"distance": 100}, { "name": "古力娜扎","pointer": 650,"distance": 150}, { "name": "古巨基", "pointer": 700,"distance": 200 }, { "name": "古天乐", "pointer": 180,"distance": 320 } ]