2010-10-23 71 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