2010-10-23 28 views
5

我以前发布这个问题为jquery/javascript:arrays - jquery/javascript: arrays。 但是,因为我是一个完整的初学者,我已经制定了错误的问题,并没有明白答案要么.... :(jquery数组相交

未能实现给定的解决方案后,我做了更多的四处寻找我发现我需要比较的可能的选择6个阵列和交叉他们最终只显示重叠值

因此,这是,hopely,更清晰的表述:。

我有6个问题/ 6组单选按钮的答案。每个答案都有多个值(他们的范围可以从1到38项显示在最终的'建议'中)。我正在收集阵列中检查过的无线电的值。我得到了6个数组秒。

我如何相交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 2010-10-23 10:28:18

+0

@mplungjan:当我更改var valArr1 = $('#vraag1 input:radio:checked')。对于var valArr1 = $('#vraag1 input:radio:checked')。它不返回任何值 – tschardak 2010-10-23 11:33:19

+0

对不起,你有没有函数checkboxval当我评论?如果是的话我的不好。然而,它过滤了,所以至少这是一个浪费 – mplungjan 2010-10-23 13:22:38

回答

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个输入中获得重叠的值/字符串。如果我理解正确,我需要拆分字符串,这会给我值我希望我知道如何运行你的代码,但是......我为我的noobness道歉......差点把我的头发拉出来...... – tschardak 2010-10-23 14:38:43

+0

你看演示了吗?另外,当你说重叠时,你的意思是说所有6个组需要有相同的数字吗?......这是它令人困惑的地方,因为你的示例HTML(其他问题)只有一个输入值,而上面的代码有不止一个。 – Mottie 2010-10-23 15:02:50

+0

是的,只有在所有6个组中出现的数字(或更多数字)需要被返回。 有6组无线电,第二组是: – tschardak 2010-10-23 15:26:12

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'的预期应用程序吗? – 2013-03-21 22:55:17

+1

@ david-john-smith上面的符号没有记录,但记录的是'.filter'接受另一个jQuery对象作为参数。所以'$([“a”,“b”])。filter($([“a”,“c”]))'是完全合法的。 – Christoph 2013-06-11 07:04:37

+0

谢谢。伟大的提示! – 2013-07-04 07:55:00

1

如果yoou想要做阵列做一个交叉操作,您可以使用jQuery插件jQuery Array Utilities

下面是如何使用它的示例代码行:

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

将返回结果[2 ,3]

+0

我工作很好,但是你有一个错字错误:相交,而不是instersect – jobima 2015-09-30 09:06:23

+0

感谢您的评论:)我做了一个更正回答 – 2016-03-06 18:43:14

+0

此交叉函数还支持任意数量的数组,此包[jquery-array-utilities](https://libraries.io/bower/jquery-array-utilities)也可以使用[bower] (https://bower.io)。我想添加一个免责声明,我最初做的插件:) – 2016-11-28 21:31:45

-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 2016-04-01 12:08:37