Gli array jQuery si intersecano
-
25-09-2019 - |
Domanda
In precedenza ho pubblicato questa domanda come jquery/javascript: array - jQuery/JavaScript: array. Ma dal momento che sono un principiante completo ho formulato la domanda e non ho capito neanche le risposte ... :(
Dopo non aver implementato le soluzioni fornite, ho fatto un po 'di più guardando intorno, ho scoperto che devo confrontare 6 array di possibili scelte e intersecarle per visualizzare finalmente solo i valori sovrapposti.
Quindi questa è una formulazione più chiara:
Ho 6 domande/6 gruppi di pulsanti di radio per le risposte. Ogni risposta ha più valori (possono variare da 1 a 38 elementi da visualizzare nei "consigli" finali). Sto raccogliendo i valori delle radio controllate negli array. Ricevo 6 array.
Come intersecano 6 array per ottenere un array finale contenente solo valori che intersecano tutte le 6 scelte? Come posso trasformare gli elementi di questo array finale in selettori?
Qualcuno può aiutarmi? Grazie!
La mia sceneggiatura sembra ora:
(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;
});
});
Il mio modulo/input sembra:
<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>
Soluzione
La tua domanda è ancora molto confusa per me.
Ma sembra che tu stia ottenendo il valore dagli input e stai cercando di combinarli. Ma sono tutte stringhe non array.
Prova solo ad aggiungere le corde insieme, quindi rompile usando 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);
})
AGGIORNAMENTO: OK, dalla tua demo HTML, non sono riuscito a ottenere 6 duplicati, quindi nella demo l'ho impostato per trovare 3+ corrispondenze. Ho dovuto scrivere questo script per trovare duplicati in un array, ho anche fatto per restituire un oggetto associativo con il numero di duplicati. Potrebbe esserci un metodo migliore, ma questo è quello che mi è venuto in mente (Demo aggiornato):
$(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];
}
Altri suggerimenti
Con jQuery caricato, puoi colpire la 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]
Mi chiedeva solo la stessa cosa e lo ha inventato:
$(["a","b"]).filter(["a","c"])
ritorna
["a"]
Se vuoi fare un'operazione interseca su array puoi utilizzare il plug -in jQuery Utilità per array jQuery
Ecco una riga di codice di esempio su come usarlo:
$.intersect([1, 2, 2, 3], [2, 3, 4, 5, 5])
restituirà il risultato [2,3
Vedere Codice più semplice per l'intersezione di array in JavaScript Per una funzione di intersezione. Dividi le stringhe con split (",") e fai un'intersezione sugli array di stringhe risultanti.
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;
}
}