5

以前、この質問を jquery/javascript: arrays - jquery/javascript: arrays として投稿しました。しかし、私は完全な初心者なので、質問を間違って作成し、答えも理解していませんでした.... :(

指定されたソリューションの実装に失敗した後、さらに調べてみると、可能な選択肢の6つの配列を比較し、それらを交差させて、重複する値のみを最終的に表示する必要があることがわかりました。

したがって、これは、うまくいけば、より明確な定式化です。

回答用に6つの質問/ラジオボタンの6つのグループがあります。各回答には複数の値があります (最終的な「アドバイス」に表示される 1 ~ 38 項目の範囲で指定できます)。チェックされたラジオの値を配列で収集しています。6つの配列を取得します。

6 つの選択肢すべてから交差する値のみを含む 1 つの最終的な配列を取得するために、6 つの配列を交差させるにはどうすればよいですか? この最終配列の項目をセレクターに変換するにはどうすればよいですか?

誰か助けてくれませんか?ありがとうございました!

私のスクリプトは次のようになります。

(function($){
  $.fn.checkboxval = function(){
      var outArr = [];
      this.filter(':checked').each(function(){
            outArr.push(this.getAttribute("value"));
      });
      return outArr;
  };
})
(jQuery);
$(function(){
  $('#link').click(function(){
    var valArr1 = $('#vraag1 input:radio:checked').checkboxval();
    var valArr2 = $('#vraag2 input:radio:checked').checkboxval();
    var valArr3 = $('#vraag3 input:radio:checked').checkboxval();
    var valArr4 = $('#vraag4 input:radio:checked').checkboxval();
    var valArr5 = $('#vraag5 input:radio:checked').checkboxval();
    var valArr6 = $('#vraag6 input:radio:checked').checkboxval();
// var newArray = $.merge(valArr1, valArr2, valArr3, valArr4, valArr5, valArr6); <- test to see if I can merge them
// $('#output').text(newArray.join(',')); <- test to see if I can join them
//$("#output").html($("#output").html().replace(/,/gi, ',#diet')); <- test to see if I can append text so it looks like the selectors of divs I need to display later
//    return false;
  });
});

私のフォーム/入力は次のようになります:

<input name="vraag1" type="radio" value="1a,4,5,12,13,17a,18,19,22,23,24,26,27,28,29,30,33,38,6" class="radio advice" id="vraag1-0" /><label for="vraag1-0">ja</label>
<br />
<input name="vraag1" type="radio" value="1b,1,2,3,7,8,11,9,14,15,16,17,20,21,25,31,34,35,36,37,10,32" class="radio advice" id="vraag1-1" /><label for="vraag1-1">nee</label>
<br />
<input name="vraag1" type="radio" value="1c,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,17a,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38" class="radio advice" id="vraag1-2" /><label for="vraag1-2">maakt mij niet uit</label>
4

6 に答える 6

17

jQuery をロードしたら、コンソールにパンチインできます。

a1=[1,2,3]
a2=[2,3,4,5]
$.map(a1,function(a){return $.inArray(a, a2) < 0 ? null : a;})

出力は次のようになります。

[2, 3]
于 2012-02-22T19:40:51.087 に答える
12

ちょうど同じことを疑問に思っていて、これを思いついた:

$(["a","b"]).filter(["a","c"])

戻り値

["a"]
于 2013-02-25T09:43:54.303 に答える
1

配列に対して交差操作を行いたい場合は、jQuery プラグインjQuery Array Utilitiesを使用できます。

これを使用する方法のコード行の例を次に示します。

$.intersect([1, 2, 2, 3], [2, 3, 4, 5, 5])

結果を返します [2,3]

于 2013-04-25T21:04:25.463 に答える
0

交差関数については、JavaScriptの配列交差の最も単純なコードを参照してください。split( "、")を使用して文字列を分割し、結果の文字列の配列で交差を実行します。

于 2011-02-23T10:59:43.363 に答える
0

あなたの質問はまだ私を非常に混乱させています。

しかし、入力から値を取得し、それらを結合しようとしているようです。しかし、それらはすべて配列ではなく文字列です。

split()文字列を一緒に追加してから、 (demo)を使用してそれらを分解してみてください

$('#link').click(function() {
    var radios = '';
    $('input:radio:checked').each(function() {
        radios += $(this).val() + ',';
    })
    // remove last comma & convert to array
    radios = radios.substring(0, radios.length - 1).split(',');
    // do something with the array
    console.debug(radios);
})

更新:わかりました、あなたのデモ HTML から、6 つの重複を取得できなかったので、デモでは 3 つ以上の一致を見つけるように設定しました。配列内の重複を見つけるために、このスクリプトを作成する必要がありました。また、重複の数で連想オブジェクトを返すようにしました。より良い方法があるかもしれませんが、これが私が思いついたものです(更新されたデモ):

$(function() {
    $('#link').click(function() {
        var radios = '';
        $('input:radio:checked').each(function() {
            radios += $(this).val() + ',';
        })
        // remove last comma & convert to array
        var results = [],
            dupes = radios
             .substring(0, radios.length - 1)
             .split(',')
             .getDuplicates(),
            arr = dupes[0],
            arrobj = dupes[1],
            minimumDuplicates = 6; // Change this to set minimum # of dupes to find

        // find duplicates with the minimum # required
        for (var i=0; i < arr.length; i++){
            if ( arrobj[arr[i]] >= minimumDuplicates ){
                results.push(arr[i]);
            }
        }

        // Show id of results
        var diets = $.map(results, function(n,i){ return '#diet' + n; }).join(',');
        $(diets).show(); // you can also slideDown() or fadeIn() here
    })
});


/* Find & return only duplicates from an Array
 * also returned is an object with the # of duplicates found
 * myArray = ["ccc", "aaa", "bbb", "aaa", "aaa", "aaa", "aaa", "bbb"];
 * x = myArray.getDuplicates();
 * // x = [ array of duplicates, associative object with # found]
 * // x = [ ['aaa','bbb'] , { 'aaa' : 5, 'bbb' : 2 } ]
 * alert(x[0]) // x[0] = ['aaa','bbb'] & alerts aaa,bbb
 * alert(x[1]['aaa']) // alerts 5;
 */
Array.prototype.getDuplicates = function(sort) {
    var u = {}, a = [], b = {}, c, i, l = this.length;
    for (i = 0; i < l; ++i) {
        c = this[i];
        if (c in u) {
            if (c in b) { b[c] += 1; } else { a.push(c); b[c] = 2; }
        }
        u[c] = 1;
    }
    // return array and associative array with # found
    return (sort) ? [a.sort(), b] : [a, b];
}
于 2010-10-23T13:36:56.173 に答える
-1
function intersect(a, b) {
    var aIsShorter = a.length < b.length;
    var shorter = aIsShorter ? a : b;
    var longer = aIsShorter ? b : a;

    return longer.filter(isFoundInOther).filter(isFoundOnce);

    function isFoundInOther(e) {
        return shorter.indexOf(e) !== -1;
    }

    function isFoundOnce(element, index, array) {
        return array.indexOf(element) === index;
    }
}
于 2016-04-01T11:46:16.840 に答える