2010-10-23 16 views
5

Ho già postato questa domanda come jquery/javascript: array - jquery/javascript: arrays. Ma dato che sono un principiante assoluto ho formulato la domanda sbagliata e non ho capito neanche le risposte .... :(jquery array intersecano

Dopo aver fallito nell'implementare le soluzioni date ho fatto un po 'di più guardandomi intorno ho scoperto che io bisogno di confrontare 6 array di scelte possibili e li si intersecano per visualizzare, infine, solo i valori sovrapposti

Quindi questo è, auspicabilmente, una formulazione più chiara:.

ho 6 domande/6 gruppi di pulsanti di opzione per le risposte. Ogni risposta ha più valori (possono variare da 1 a 38 elementi da visualizzare in "consigli" finali.) Sto raccogliendo i valori delle radio verificate negli array. S.

Come incrocio 6 matrici per ottenere un array finale contenente solo valori intersecanti da tutte le 6 scelte? Come si trasformano gli elementi di questa matrice finale in selettori?

Qualcuno può aiutarmi? Grazie!

Il mio script appare ormai come:

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

mia forma/ingressi assomiglia:

<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

Questo non è $ ('# input vraagX: radio: checked'). Val(); e non checkboxval()? – mplungjan

+0

@mplungjan: quando cambio var valArr1 = $ ('# vraag1 input: radio: checked'). Checkboxval(); in var valArr1 = $ ('# vraag1 input: radio: checked'). Val(); non restituisce alcun valore – tschardak

+0

Mi dispiace, hai avuto la funzione checkboxval quando ho commentato ???? Se è così il mio male. Tuttavia filtra e così fa anche la chiamata ad esso, almeno questo è un rifiuto – mplungjan

risposta

0

La tua domanda è ancora molto confuso per me.

Ma sembra che stiate ottenendo il valore dagli input e provando a combinarli. Ma sono tutte stringhe e non matrici.

Prova semplicemente aggiungendo le corde insieme, poi li spezzando utilizzando 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); 
}) 

Update: Ok, dal HTML demo, non ho potuto ottenere 6 duplicati così nella demo L'ho impostato per trovare più di 3 partite. Ho dovuto scrivere questo script per trovare i duplicati in un array e l'ho fatto anche per restituire un oggetto associativo con il numero di duplicati. Ci può essere un metodo migliore, ma questo è ciò che mi si avvicinò con (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: grazie per la tua reazione! il mio scopo è quello di ottenere solo valori/stringhe sovrapposti da questi 6 input. se capisco correttamente ho bisogno di dividere le stringhe, che mi darà dei valori ?? Vorrei sapere come eseguire il tuo codice, anche se ... mi scuso per il mio noobness ... mi sta quasi strappando i capelli ... – tschardak

+0

Hai visto la demo? Inoltre, quando dici sovrapposizione, intendi che tutti e 6 i gruppi devono avere lo stesso numero? ... questo è il punto in cui diventa confuso perché l'HTML di esempio (altra domanda) ha solo un valore nell'input mentre il tuo codice sopra ha molto più di uno. – Mottie

+0

sì, solo un numero (o più numeri) che si verifica in tutti i 6 gruppi deve essere restituito. ci sono 6 gruppi di radio, il secondo è: – tschardak

17

con jQuery caricato, è possibile pugno nella console:

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

L'output dovrebbe essere:

[2, 3] 
12

stavo chiedendo la stessa cosa e si avvicinò con questo:

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

resi

["a"] 
+0

Incredibile! Questa è un'applicazione prevista di '.filter'? –

+1

@ david-john-smith La notazione di cui sopra non è documentata, ma ciò che è documentato è che '.filter' accetta un altro oggetto jQuery come parametro. Quindi '$ ([" a "," b "]). Filter ($ ([" a "," c "]))' è perfettamente legale. – Christoph

+0

Grazie. Ottimo consiglio! –

1

Se yoou vuole fare fare un'operazione Intersect su array è possibile utilizzare il plugin jQuery jQuery Array Utilities

Ecco una linea di codice di esempio di come usarlo:

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

restituirà il risultato [2 , 3]

+0

Funziono benissimo ma si ha un errore di battitura: intersecare, non instersect – jobima

+0

Grazie per il commento :) Ho fatto un correzione alla risposta –

+0

Questa funzione intersect supporta anche un numero arbitrario di matrici, Questo pacchetto [jquery-array-utilities] (https://libraries.io/bower/jquery-array-utilities) può anche essere installato utilizzando [bower] (https://bower.io). Vorrei aggiungere una dichiarazione di non responsabilità che ho originariamente creato il plugin :) –

-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

Cura di aggiungere una spiegazione al tuo codice e come risponde alla domanda dell'OP? – aribeiro