4

コンマ区切りの数字を含む 3 つの文字列があります。

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

これら3つの文字列を相互にチェックしたい(すべての共通要素を取得するため)
期待される出力

var result = 1,5;

文字列が 2 つしかない場合、これは既に使用したロジックです

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

文字列を配列に格納して開始できれば、最も簡単です。あなたがそうすることができれば、以下はそのトリックを行うはずです。これは、必要に応じて変更なしで 3 つ以上をチェックするようにもスケーリングされます。

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

関数を再帰的に呼び出すことができます-

最初の 2 つの文字列に共通する要素を見つけたら、

コモンを次の文字列と比較するなど、

関数に渡すのと同じ数の引数に対して。

この例では、すべての文字列にカンマで区切られた 2 つの '5' が含まれている場合、 2 つの '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 に答える
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 に答える