js 判断数组中每一个元素是否有相同的部分

[
"//information_schema/CHARACTER_SETS",
 "//information_schema/COLLATIONS", 
 "//information_schema/COLLATION_CHARACTER_SET_APPLICABILITY", 
 "//information_schema/COLUMNS",
 "//ghy",
 "//performance_schema/accounts",
 "//performance_schema/cond_instances", 
 "//performance_schema/events_stages_current",
 "//performance_schema/events_stages_history", 
 "//test1/test1"
]

判断数组中这些元素有没有相同的部分(除了//),每一个都含有相同的字符串则返回true,没有则返回false。
比如:

[
"//information_schema/CHARACTER_SETS",
 "//information_schema/COLLATIONS", 
 "//information_schema/COLLATION_CHARACTER_SET_APPLICABILITY", 
 "//information_schema/COLUMNS"
]

数组中四个元素均含有information_schema,如果数组只有这四个元素,则返回true。
如果是对于整个数组而言,无法人为的切割呢

场景:

clipboard.png

如果,这样勾选,不需要对返回的数组元素处理:

[
"ghy",
"performance_schema",
"test"
]

如果勾选了两个数据库test1和test4其中一个表,则返回false,见下图

clipboard.png

如果勾选了两个数据库test1和test4,其中数据库test1的表test1和test2都勾选了,同时数据库test4的表course勾选了,这样也要返回false,见下图
如果数据库的表全部勾选,只处理数据库即可

[
"test1",
"course"
]

clipboard.png

阅读 7k
5 个回答
const data1 = [
    "//information_schema/CHARACTER_SETS",
    "//information_schema/COLLATIONS",
    "//information_schema/COLLATION_CHARACTER_SET_APPLICABILITY",
    "//information_schema/COLUMNS",
    "//ghy",
    "//performance_schema/accounts",
    "//performance_schema/cond_instances",
    "//performance_schema/events_stages_current",
    "//performance_schema/events_stages_history",
    "//test1/test1"
];

const data2 = [
    "//information_schema/CHARACTER_SETS",
    "//information_schema/COLLATIONS",
    "//information_schema/COLLATION_CHARACTER_SET_APPLICABILITY",
    "//information_schema/COLUMNS"
];

const data3 = [
    "//CHARACTER_SETS//information_schema",
    "//information_schema/COLLATIONS",
    "//information_schema/COLLATION_CHARACTER_SET_APPLICABILITY",
    "//information_schema/COLUMNS",
];

function hasSameSegment(array) {
    // 如果 length < 2 显然没啥好比较的
    if (array.length < 2) {
        return true;
    }

    const [firstEl, ...rest] = array;

    // 把第一项中各段保存在一个数组中
    let segments = firstEl.split("/").filter(s => s);

    rest.forEach(el => {
        // 先生成一个 map 便于检索
        const map = el.split("/")
            .filter(s => s)
            .reduce((all, s) => {
                all[s] = s;
                return all;
            }, {});
        
        // 如果 segments 中某一段不存在于 map 中
        // 说明至少有一个列表元素不包含该段
        segments = segments.filter(s => map[s]);
    });

    // segments 最后如果还留下有一些段,
    // 那这些段肯定是每个列表元素中都包含的
    return !!segments.length;
}

[data1, data2, data3].forEach(d => console.log(hasSameSegment(d)));

如果只是按\\\分段比较就比较简单

let hasSameSegment = list => {
    let [first_segments, ...rest] = list.map(str => str.split(/\/+/).filter(str => str));
    return rest.every(segment => {
        first_segments = first_segments.filter(seg => segment.includes(seg));
        return first_segments.length > 0;
    });
}

鉴于不可能匹配任意字段,因为'a','b'也算字段
结合你给的数组,默认取'/'划分的字符串进行匹配
能够做到即使不在相同的位置也能匹配
亮点在于全字符串用match来匹配第一个元素里的目标字符串

function sameStrHasFound(arr) {
  var result = false
  if (arr.length <= 1) return false //小于2为false
  //全部字符串连接起来
  var allStr = arr.join('!(@*!!)#(*!)@*')
  //第一个字符串用/来分隔,同时去除空字符串的情况,并循环各个目标字符串
  arr[0].split('/').filter(str => { return str != '' }).forEach(str => {
    if (result) return
    //求目标字符串匹配个数
    var match = allStr.match(new RegExp(str, 'gi'))
    //如果匹配个数是原数组长度则为true
    if (match !== null && match.length === arr.length) result = true
  });
  return result
}
var list1 = [
  "//information_schema/CHARACTER_SETS",
  "//information_schema/COLLATIONS",
  "//information_schema/COLLATION_CHARACTER_SET_APPLICABILITY",
  "//information_schema/COLUMNS",
  "//ghy"
]
var list2 = [
  "//information_schema/CHARACTER_SETS",
  "//information_schema/COLLATIONS",
  "//information_schema/COLLATION_CHARACTER_SET_APPLICABILITY",
  "//information_schema/COLUMNS",
]
var list3 = [
  "//CHARACTER_SETS//information_schema",
  "//information_schema/COLLATIONS",
  "//information_schema/COLLATION_CHARACTER_SET_APPLICABILITY",
  "//information_schema/COLUMNS",
]
console.log(sameStrHasFound(list1), sameStrHasFound(list2), sameStrHasFound(list3))
function equals(arr){
          // 定义一个空数组来接收
        var one = [];
        // 需要将原来的数组做一下格式化以便处理
           var a_arr = arr.toString().split('//');
        var b_arr = a_arr.filter((item1,index) => {
            return index>0;
        });
        // 将处理好的数组遍历,并将元素的前半部分放进一个新的数组中
        for(var i in b_arr) {
            var    key = b_arr[i].substring(0, b_arr[i].indexOf('/'));
            one.push(key);
        }
          // console.log(one[0]);
        // console.log(one);

        // 通过Array.prototype.every() 方法进行对数组所有元素测试
        return one.every(item => item === one[0]);
    }

经过测试均能通过,上面的大哥比我厉害,我想了一晚上,但是我俩思路是一样的,希望采纳~

假设待比较数组str长度为5;

  1. 求str[0],str[1]的最长公共子串lcs;

  2. 循环求lcs与str[i]的最大公共子串lcs

  3. if(lcs.length > 0) return true else return false;

function LCSFunc(str1, str2){
    //...
}
let lcs = LCSFunc(str[0],str[1]);
for(let i=2; i<str.length; i++){
    lcs = LCSFunc(lcs, str[i])
    if(lcs.length > 0) return true else return false;

}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题