【问题标题】:check multiple string contains to each other using javascript使用javascript检查多个字符串是否相互包含
【发布时间】:2013-05-09 04:34:01
【问题描述】:

我有三个包含逗号分隔数字的字符串。

var str1 = "1,5,3";
var str2 = "2,5,1";
var str3 = "3,2,1,5"; 

我想把这三个字符串相互检查(获取所有字符串之间的共同元素)
预期输出

var result = 1,5;

如果我只有两个字符串,这是我已经使用的逻辑

var array = str2.split(',');
for(var item in array) {
var contains = (str1.indexOf(array[item]) > -1);
if(contains == 1) {
    var result = array[item]+',';
    getele2 += result;
    geteleresult = getele2.replace(/\,$/, '');
  }
}
alert(geteleresult);

但是当检查多个字符串时,我不知道如何为这些应用排序逻辑。任何想法然后请帮助 谢谢...

【问题讨论】:

    标签: javascript for-loop foreach


    【解决方案1】:

    你可以试试这个函数和逻辑:

    function findCommon() {
        var nums = {};
        var args_length = arguments.length;
        for (var i = 0; i < args_length; i++) {
            var cur_arg = arguments[i];
            var cur_found = {};
    
            var cur_arg_split = cur_arg.split(",");
            for (var j = 0; j < cur_arg_split.length; j++) {
                var cur_val = cur_arg_split[j];
                if (!(cur_val in cur_found)) {
                    cur_found[cur_val] = 1;
                    if (!(cur_val in nums)) {
                        nums[cur_val] = 0;
                    }
                    nums[cur_val]++;
                }
            }
        }
    
        var ret = [];
        for (var key in nums) {
            if (nums[key] === args_length) {
                ret.push(key);
            }
        }
        return ret;
    }
    

    演示: http://jsfiddle.net/LkEyj/1/

    它允许您将任意数量的变量(包含逗号分隔数字的字符串)传递给函数。

    【讨论】:

      【解决方案2】:

      这个简单的方法怎么样:

      function common() {
          var arg = [].slice.call(arguments),
              com = [], i;
      
          for (i = 1; i < arg.length; i++) {
              com = arg[i].match(RegExp((com.length ? com : arg[0].split(',')).join('|'), 'g'));
          }
      
          return com;
      }
      

      http://jsfiddle.net/tUvWM/

      它非常简单,并且支持任意数量的字符串。例如

      var arr = common(str1, str2, str3, str4);
      

      【讨论】:

        【解决方案3】:

        你可以使用indexOf()方法

        var str1 = "1,5,3";
        var str2 = "2,5,1";
        var str3 = "3,2,1,5";
        
        var array1 = str1.split(',');
        var array2 = str2.split(',');
        var array3 = str3.split(',');
        var output = [];
        for(var i=0;i<array1.length;i++)
        {
            if(array2.indexOf(array1[i]) >= 0 && array3.indexOf(array1[i]) >= 0)
               output.push(array1[i]);
        }
        alert(output);
        

        JS Fiddle

        【讨论】:

        • @prashanth 这对我来说看起来不错。不知道为什么这被否决了。
        • @HaBo 我这里有一些讨厌的人,他们曾经对我的所有答案投反对票
        • 我们有时都会经历这种情况:)
        • @HaBo 我认为他们嫉妒我们 :)
        【解决方案4】:

        您可以将值存储在数组中,然后应用 .sort() 方法对值进行排序。

        var str1 = "1,5,3";
        var str2 = "2,5,1";
        var str3 = "3,2,1,5";
        var getele2="";
        var rarray = new Array();
        var array = str2.split(',');
        for(var item in array) {
        var contains = (str1.indexOf(array[item]) > -1);
        if(contains == 1){
        var result = array[item];
        rarray.push(result);
        }
        }
        alert(rarray.sort());
        

        这是小提琴: Demo

        http://jsfiddle.net/jvaibhav/BsFPW/

        【讨论】:

        • 我怀疑这是否适用于像 '11,2,3' 和 '1,22,33,4' 这样的字符串
        • @HaBo:同意。但是 OP 指定了字符串和预期的输出,所以我发布了这个。
        • @HaBo:谢谢。对于普遍情况 indexOf() 方法很好,因为 prashant 回答了。
        【解决方案5】:

        如果您可以将字符串存储在数组中以开始,那将是最简单的。如果你能做到这一点,以下应该可以解决问题。如果需要,这也可以扩展到检查三个以上而无需更改。

        str[0] = "1,5,3";
        str[1] = "2,5,1";
        str[2] = "3,2,1,5"; 
        
        var matches = '';
        for(var i=0;i<str.length-1;i++) {
            if(i==0)
                var str1 = str[i].split(',');
            else
                var str1 = matches.split(',');
            var str2 = str[i+1].split();
            var newMatches = '';
            for(var item in str2) {
                var contains = (str1.indexOf(array[item]) > -1);
                if(contains == 1) {
                    var result = array[item]+',';
                    newMatches += result;
                }
            }
            matches = newMatches.replace(/\,$/, '');
        }
        
        return matches;
        

        【讨论】:

          【解决方案6】:

          你可以递归调用一个函数-

          找到前两个字符串共有的元素后,

          比较下一个字符串的共同点,以此类推,

          与传递给函数的参数一样多。

          如果所有字符串都包含两个逗号分隔的 '5',则此示例将返回 两个 '5'。 (它们不必是数字,字符串也一样。)

          function inCommon(s1, s2){
              var L1= s1.length, L2= s2.length, rx, 
              A1,  next, next1, next2, least, common= [];
              A1= (L1<= L2)? s1.split(','):s2.split(',');
          
              for(var i= 0, L= A1.length; i<L; i++){
                  next= A1[i];
                  rx= RegExp('(^|,)'+next+'(,|$)', 'g');
                  next1= (s1.match(rx) || []).length;
                  next2= (s2.match(rx) || []).length;
                  least= Math.min(next1, next2);
                  while(least--) common.push(next);
              }
              if(arguments.length>2 && common.length){
                  var a= common.slice.call(arguments, 2);
                  a.unshift(common.join(','));
                  return inCommon.apply(window, a);
              }
              return common;
          }
          var str1= "1,5,3";
          var str2= "2,5,1";
          var str3= "3,2,1,5";
          
          inCommon(str1, str2, str3)
          
          /*  returned value: (Array)
          1,5
          */
          

          【讨论】:

            猜你喜欢
            • 2021-10-07
            • 2014-12-27
            • 2012-08-02
            • 1970-01-01
            • 1970-01-01
            • 2023-03-27
            • 2014-06-25
            • 2013-02-05
            • 2013-02-08
            相关资源
            最近更新 更多