4

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

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);

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

4

6 回答 6

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/

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

于 2013-05-09T04:56:19.670 回答
1

这个简单的方法怎么样:

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);
于 2013-05-09T05:13:45.327 回答
0

你可以使用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小提琴

于 2013-05-09T04:52:27.443 回答
0

您可以将值存储在数组中,然后应用 .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());

这是小提琴: 演示

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

于 2013-05-09T04:53:09.947 回答
0

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

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;
于 2013-05-09T05:01:31.630 回答
0

您可以递归调用函数-

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

将公地与下一个字符串进行比较,依此类推,

对于传递给函数的尽可能多的参数。

如果所有字符串都包含两个逗号分隔的“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
*/
于 2013-05-09T05:35:24.967 回答