我有一個字符串的兩個數組:有沒有辦法在兩個數組中找到匹配元素?
"bob marley", "bob dylan", "bob harris"
和
"alfred hitchcock", "matt damon", "bob marley"
我如何比較這兩個數組,並找到鮑勃·馬利存在於兩個?
我有一個字符串的兩個數組:有沒有辦法在兩個數組中找到匹配元素?
"bob marley", "bob dylan", "bob harris"
和
"alfred hitchcock", "matt damon", "bob marley"
我如何比較這兩個數組,並找到鮑勃·馬利存在於兩個?
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");
}
});
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]
是精確的(區分大小寫)
添加一個陣列的字符串作爲對象中的屬性,然後搜索其他元素:
var obj = {}
var matching = [];
$.each(array1,function(index,s) { obj[s] = true; });
$.each(array2,function(index,s) {
if (obj[s])
matching.push(s);
});
如果你的數組不是很大,一個天真的解決方案(比較一個數組的所有元素與另一個數組的所有元素)也可能工作得很好。
你想要什麼被稱爲集合的交集(在這種情況下是數組)。沒有內置的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;
})
});
這基本上是設定交叉點,其中集合是用無序陣列表示。如果有一個排序函數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;
}
你可以做
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;
}
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/
如果你不想寫數組路口,你依然可以使用下劃線
取自http://documentcloud.github.com/underscore/
intersection_.intersection(* arrays) 計算所有數組相交值的列表。結果中的每個值都存在於每個數組中。
_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2]
這裏有很多答案,所有的工作。如果你只是處理字符串,我認爲這是最快的。它只做每個數組的一個循環,然後在結果中循環一次。如果數組不只是幾個條目,其他大多數示例都會執行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/
匹配的元素保證是一個字符串? – 2012-03-09 21:11:51
你想檢索所有匹配,或者只是檢查兩個值是否存在? – vol7ron 2012-03-09 21:12:35
保證是一個字符串,是的。 – Trip 2012-03-09 21:20:53