سؤال

سبق أن نشرت هذا السؤال باسم jQuery/JavaScript: المصفوفات - jQuery/JavaScript: المصفوفات. لكن بما أنني مبتدئ كامل ، فقد صاغت السؤال بشكل خاطئ ولم أفهم الإجابات أيضًا .... :(

بعد الفشل في تنفيذ الحلول المعطاة ، قمت ببعض البحث حول أنني اكتشفت أنني بحاجة لمقارنة 6 صفائف من الخيارات المحتملة وتقاطعها لعرض القيم المتداخلة فقط.

لذلك هذا ، على أمل ، صياغة أوضح:

لدي 6 أسئلة/6 مجموعات من أزرار الراديو للحصول على إجابات. كل إجابة لها قيم متعددة (يمكن أن تتراوح من 1 إلى 38 عنصرًا ليتم عرضها في "النصيحة" النهائية). أقوم بجمع قيم أجهزة الراديو التي تم فحصها في المصفوفات. أحصل على 6 صفائف.

كيف يمكنني تقاطع 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>
هل كانت مفيدة؟

المحلول

سؤالك لا يزال مربكا للغاية بالنسبة لي.

ولكن يبدو أنك تحصل على القيمة من المدخلات ومحاولة الجمع بينها. لكنها كلها سلاسل لا صفائف.

حاول فقط إضافة الأوتار معًا ، ثم تفككها باستخدام split() (العرض التوضيحي)

$('#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];
}

نصائح أخرى

مع تحميل jQuery ، يمكنك اللكم في وحدة التحكم:

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

يجب أن يكون الإخراج:

[2, 3]

كان فقط أتساءل نفس الشيء وتوصل إلى هذا:

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

عائدات

["a"]

إذا كنت تريد القيام بعملية متقاطعة في المصفوفات ، يمكنك استخدام المكون الإضافي jQuery jQuery Array Utilities

فيما يلي خط رمز مثال على كيفية استخدامه:

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

سيعود النتيجة [2،3

نرى أبسط رمز لتقاطع الصفيف في جافا سكريبت لوظيفة التقاطع. تقسيم الأوتار مع الانقسام ("،") وقم بتقاطع على المصفوفات الناتجة من الأوتار.

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;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top