2010-10-23 28 views
5

He publicado anteriormente esta pregunta como jquery/javascript: arrays - jquery/javascript: arrays. Pero dado que soy un principiante completo, he formulado la pregunta equivocada y tampoco entendí las respuestas .... :(jquery arrays intersect

Después de no aplicar las soluciones dadas, investigué un poco más y descubrí que que comparar 6 conjuntos de opciones posibles y les entrecruzan para mostrar al final sólo los valores superpuestos

Así que esto es, hopely, una formulación más clara:.

tengo 6 preguntas/6 grupos de botones de radio en busca de respuestas. Cada respuesta tiene valores múltiples (pueden oscilar entre 1 y 38 elementos para mostrarse en el "consejo" final). Estoy recopilando los valores de las radios comprobadas en las matrices. Obtengo 6 matriz s.

¿Cómo se intersectan 6 matrices para obtener una matriz final que contiene solo 6 valores de intersección de las 6 opciones? ¿Cómo convierto los elementos de este conjunto final en selectores?

¿Alguien puede ayudarme? ¡Gracias!

Mi script busca ahora gustan:

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

mi forma/entradas se parece a:

<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

¿No sería $ ('# entrada de vraagX: radio: comprobado'). Val(); y no checkboxval()? – mplungjan

+0

@mplungjan: cuando cambio var valArr1 = $ ('# vraag1 input: radio: checked'). Checkboxval(); a var valArr1 = $ ('# entrada vraag1: radio: marcado'). Val(); no devuelve ningún valor – tschardak

+0

Lo siento, ¿tenía la función checkboxval cuando comencé ???? Si es así mi mal. Sin embargo, filtra y también lo hace la llamada, así que al menos eso es un desperdicio – mplungjan

Respuesta

0

Su pregunta es todavía muy confuso para mí.

Pero parece que obtiene el valor de las entradas y trata de combinarlas. Pero son todas cadenas, no matrices.

intente Es la adición de las cadenas juntas, entonces éstas se descompongan 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); 
}) 

Actualización: Ok, desde su HTML de demostración, no pude conseguir 6 duplicados por lo que en la demo Lo configuré para encontrar 3 o más coincidencias. Tuve que escribir esta secuencia de comandos para encontrar duplicados en una matriz. También hice para devolver un objeto asociativo con la cantidad de duplicados. Puede haber un método mejor, pero esto es lo que me ocurrió 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: gracias por tu reacción! mi objetivo es finalmente obtener solo valores/cadenas superpuestas de estas 6 entradas. Si entiendo correctamente, necesito dividir las cuerdas, lo que me dará valores. Aunque me gustaría saber cómo ejecutar tu código ... me disculpo por mi noobness ... casi tirando de mi cabello aquí ... – tschardak

+0

¿Has mirado la demostración? Además, cuando dice superposición, ¿quiere decir que los 6 grupos necesitan tener el mismo número? ... aquí es donde se vuelve confuso porque su muestra de HTML (otra pregunta) solo tiene un valor en la entrada mientras que su código anterior tiene mucho más que uno – Mottie

+0

sí, solo se devolverán los números (o más números) que ocurran en los 6 grupos. hay 6 grupos de radios, el segundo es: – tschardak

17

con jQuery cargado, puede pinchar en la consola:

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

la salida debe ser:

[2, 3] 
12

simplemente preguntaba lo mismo y se le ocurrió esto:

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

devuelve

["a"] 
+0

¡Increíble! ¿Es esta una aplicación prevista de '.filter'? –

+1

@ david-john-smith La notación anterior no está documentada, pero lo que está documentado es que '.filter' acepta otro objeto jQuery como parámetro. Entonces '$ ([" a "," b "]). Filter ($ ([" a "," c "]))' es perfectamente legal. – Christoph

+0

Gracias. ¡Un gran consejo! –

1

Si yoou quieren hacer hacer una operación se cruzan en matrices puede utilizar el plugin de jQuery jQuery Array Utilities

Aquí es un ejemplo de línea de código de cómo usarlo:

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

devolverá el resultado [2 , 3]

+0

Funciono de maravilla pero tiene un error tipográfico: se cruzan, no se inserta – jobima

+0

Gracias por el comentario :) He hecho una corrección a la respuesta –

+0

Esta función intersecar también admite un número arbitrario de matrices. Este paquete [jquery-array-utilities] (https://libraries.io/bower/jquery-array-utilities) también se puede instalar usando [bower] (https://bower.io). Me gustaría agregar un descargo de responsabilidad que originalmente hice el complemento :) –

-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

¿Desea agregar una explicación a su código y cómo responde a la pregunta del OP? – aribeiro