2010-10-23 3 views
5

Я ранее разместил этот вопрос как jquery/javascript: массивы - jquery/javascript: arrays. Но, так как я полный новичок, я сформулировал вопрос неправильно и не понял ответов либо .... :(jquery arrays intersect

После того, как я не смог реализовать данные решения, я немного осмотрелся, узнал, что я нужно сравнить 6 массивов возможных вариантов и пересекают их, наконец, отображать только пересекающиеся значения

Так что это, Hopely, более четкую формулировку:.

У меня есть 6 вопросов/6 групп переключателей для ответов. Каждый ответ имеет несколько значений (они могут варьироваться от 1 до 38 элементов, которые будут отображаться в окончательном «совете»). Я собираю значения проверенных радиостанций в массивах. Я получаю 6 массивов s.

Как мне пересечь 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> 
+0

Это не будет $ ('# vraagX input: radio: checked'). Val(); а не checkboxval()? – mplungjan

+0

@mplungjan: когда я изменяю var valArr1 = $ ('# vraag1 input: radio: checked'). Checkboxval(); to var valArr1 = $ ('# vraag1 input: radio: checked'). Val(); он не возвращает никаких значений – tschardak

+0

К сожалению, у вас есть функция checkboxval, когда я прокомментировал ???? Если так, то я плохой. Однако он фильтрует, и поэтому вызов ему так, по крайней мере, является ненужным ненужным – mplungjan

ответ

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+ матча. Мне пришлось написать этот скрипт, чтобы найти дубликаты в массиве, я также сделал его, чтобы вернуть ассоциативный объект с количеством дубликатов. Там может быть лучшим способом, но это то, что я придумал (updated demo):

$(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]; 
} 
+0

@fudgey: спасибо за реакцию! моя цель состоит в том, чтобы, наконец, получить только перекрывающиеся значения/строки из этих 6 входов. если я правильно понимаю, мне нужно разделить строки, которые дадут мне значения? Мне жаль, что я не знал, как запустить ваш код, хотя ... я извиняюсь за свою непринужденность ... чуть не вытащил мои волосы здесь ... – tschardak

+0

Вы посмотрели демо? Кроме того, если вы говорите о перекрытии, вы имеете в виду, что все 6 групп должны иметь одинаковое число? ... вот где это запутывает, потому что ваш образец HTML (другой вопрос) имеет только одно значение во вводе, тогда как ваш код выше намного больше, чем один. – Mottie

+0

Да, только числа (или несколько чисел), которые встречаются во всех 6 группах, нуждаются в возврате. есть 6 групп радиостанций, второй: – tschardak

17

С загружены JQuery, вы можете ударить в консоли:

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

Вывод должен быть:

[2, 3] 
12

Было просто интересно, то же самое и пришел с этим:

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

["a"] 
+0

Удивительно! Является ли это предполагаемым применением '.filter'? –

+1

@ david-john-smith. Обозначения, приведенные выше, не документированы, но документально подтверждается, что '.filter' принимает другой объект jQuery в качестве параметра. Таким образом, '$ ([" a "," b "]). Filter ($ ([" a "," c "]))' является совершенно законным. – Christoph

+0

Спасибо. Отличный совет! –

1

Если yoou хотите сделать сделать операцию пересекаться с массивами вы можете использовать плагин JQuery jQuery Array Utilities

Вот пример строки кода, как использовать его:

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

возвращает результат [2 , 3]

+0

Я отлично работаю, но у вас есть опечатка error: intersect, not instersect – jobima

+0

Спасибо за замечание :) Я сделал коррекция ответа –

+0

Эта функция пересечения также поддерживает произвольное количество массивов. Этот пакет [jquery-array-utilities] (https://libraries.io/bower/jquery-array-utilities) также можно установить с помощью [bower] (https://bower.io). Я хотел бы добавить заявление об отказе от ответственности, которое я изначально сделал плагин :) –

-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; 
    } 
} 
+0

Не забудьте добавить объяснение к вашему коду и как оно отвечает на вопрос OP? – aribeiro

 Смежные вопросы

  • Нет связанных вопросов^_^