2012-03-09 36 views
2

我有一個字符串的兩個數組:有沒有辦法在兩個數組中找到匹配元素?

"bob marley", "bob dylan", "bob harris" 

"alfred hitchcock", "matt damon", "bob marley" 

我如何比較這兩個數組,並找到鮑勃·馬利存在於兩個?

+0

匹配的元素保證是一個字符串? – 2012-03-09 21:11:51

+0

你想檢索所有匹配,或者只是檢查兩個值是否存在? – vol7ron 2012-03-09 21:12:35

+0

保證是一個字符串,是的。 – Trip 2012-03-09 21:20:53

回答

3
var arr1 = ["bob marley", "bob dylan", "bob harris"]; 
var arr2 = ["alfred hitchcock", "matt damon", "bob marley"]; 

$.each(arr1, function(i, val) { 
    if ($.inArray(val, arr2) !== -1) { 
     console.log(val + " is in both"); 
    } 
});​ 

http://jsfiddle.net/BvTTf/

+2

應該是'$ .inArray(val,arr2 )> = 0',不應該嗎? – Niko 2012-03-09 21:10:49

+0

呃,是的。有一段時間讓這個工作。我似乎今天晚上受到了挑戰。 – karim79 2012-03-09 21:14:37

+0

對不起。歡呼耐心。 – karim79 2012-03-09 21:18:00

2
var array1 = []; 
var array2 = []; 
var matched = []; 

for (var i = 0; i < array1.length; i++){ 
    var s = array[i]; 
    for (var j = 0; j < array2.length; j++){ 
     if (s == array2[j]){ 
      matched.push(s); 
      break; 
     } 
    } 
} 

然後matched將包含在兩個陣列中發生

通知字符串比較s == array2[j]是精確的(區分大小寫)

1

添加一個陣列的字符串作爲對象中的屬性,然後搜索其他元素:

var obj = {} 
var matching = []; 
$.each(array1,function(index,s) { obj[s] = true; }); 
$.each(array2,function(index,s) { 
    if (obj[s]) 
     matching.push(s); 
}); 

如果你的數組不是很大,一個天真的解決方案(比較一個數組的所有元素與另一個數組的所有元素)也可能工作得很好。

2

你想要什麼被稱爲集合的交集(在這種情況下是數組)。沒有內置的JavaScript或jQuery函數來執行此操作,但您可以通過多種方式輕鬆編寫代碼。這裏是一個:

$(function() { 
    var array1 = ["bob marley", "bob dylan", "bob harris"]; 
    var array2 = ["alfred hitchcock", "matt damon", "bob marley", "bob dylan"]; 

    var intersect = $.map(array1, function(el) { 
     return $.inArray(el, array2) < 0 ? null : el; 
    }) 
}); 

演示:http://jsfiddle.net/jtbowden/2mxzX/

1

這基本上是設定交叉點,其中集合是用無序陣列表示。如果有一個排序函數cmp對數組中的元素進行排序,則可以將無序表示轉換爲更易於相交的有序表示。

function commonElements(arr1, arr2, cmp) { 
    // Defensively copy the input. 
    arr1 = arr1.slice(0); 
    arr2 = arr2.slice(0); 
    // Assume the natural ordering if none is provided. 
    // cmp should return a negative number to indicate that the first 
    // argument is less than the second, a positive to indicate the opposite 
    // and 0 to indicate equivalence. 
    cmp = cmp || function (a, b) { return a < b ? -1 : a > b ? 1 : 0; }; 
    // Convert the input arrays to ordered form in O(n*log n) time so we 
    // can intersect the arrays in O(n) time instead of O(n*m). 
    arr1.sort(cmp); 
    arr2.sort(cmp); 
    var intersection = []; 
    var i1 = 0, i2 = 0, n1 = arr1.length, n2 = arr2.length; 
    while (i1 < n1 && i2 < n2) { 
    var el1 = arr1[i1], el2 = arr2[i2]; 
    var delta = cmp(el1, el2); 
    if (delta) { 
     // If el1 < el2, increment i1 so we compare el2 with 
     // the next element of arr1 on loop reentry. 
     // Otherwise, increment i2 for similar reasons. 
     if (delta < 0) { ++i1; } else { ++i2; } 
    } else { // Found a match. 
     intersection.push(el1); 
     ++i1, ++i2; 
    } 
    } 
    // There will be no intersection in the unscanned portion of whichever 
    // array we did not fully traverse so we're done. 
    return intersection; 
} 
1

你可以做

function getSimilar(array1, array2) { 

var exists = {}; 
var similar = []; 

    for(var i = 0; i < array1.length; i++) { 
    exists[array1[i]] = true; 
    } 
    for(var i = 0; i < array2.length; i++) { 
    if(exists[array2[i]]) { 
     similar.push(array2[i]); 
    } 
    } 
    return similar; 
} 
1
var arr = ["bob marley", "bob dylan", "bob harris"]; 
var arr1 = ["alfred hitchcock", "matt damon", "bob marley"]; 

function findCommonElements(arr, arr1){ 
    var matches=[]; 
    for(var i=0; i < arr.length;i++){ 
     for(var x=0; x < arr1.length; x++){ 
     if(arr[i] == arr1[x]){ 
      matches.push(arr[i]); 
     } 
     } 
    } 
    return matches; 
} 

退房工作的例子:http://jsfiddle.net/Vuryj/

4

如果你不想寫數組路口,你依然可以使用下劃線

取自http://documentcloud.github.com/underscore/

intersection_.intersection(* arrays) 計算所有數組相交值的列表。結果中的每個值都存在於每個數組中。

_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]); 
=> [1, 2] 
1

這裏有很多答案,所有的工作。如果你只是處理字符串,我認爲這是最快的。它只做每個數組的一個循環,然後在結果中循環一次。如果數組不只是幾個條目,其他大多數示例都會執行100或1000個循環。

var names1 = ["john", "steve", "joe", "tom", "marco", "eric", "buddy"]; 
var names2 = ["joe", "marco", "buddy", "chris", "tim", "clarke", "pat"]; 

var intersection = function(firstArray, secondArray) { 
    var matches = {}, results = [], a = firstArray, b = secondArray, i, l; 

    for (i=0, l=a.length; i<l; i++) { 
     matches[a[i]] = 1; 
    } 

    for (i=0, l=b.length; i<l; i++) { 
     if (matches[b[i]]) matches[b[i]]++; 
    } 

    for (i in matches) { 
     if (matches[i] === 2) results.push(i); 
    } 

    return results; 
}; 

console.log(intersection(names1,names2)); 

基本上它循環遍歷第一個數組,並將每個條目添加到值爲1的對象。然後它會遍歷第二個數組,如果對象已經有了一個鍵,那麼它將它遞增1。然後循環遍歷該對象,並將所有鍵值都爲2的值推送到它返回的新數組中。

即使在每個陣列中有超過1000個條目,這也只會產生三個總循環。

這裏是一個jsfiddle:http://jsfiddle.net/pseudosavant/5EeUZ/

相關問題