2013-12-18 120 views
0

我想提出一個簡單的WebSockets聊天,有兩個陣列(這是服務器端,Node.js的):匹配兩個不同陣列中值

var clients = {1: "info about 1", 2: "info about 2", 3: "info about 3", 4: "info about four", 5: "info about five", 6: "info about six"}; 
var partners = [[1,3], [2,6], [5, 4]]; 

現在我需要做的,是查找一個客戶是合作伙伴陣營中的合作伙伴。因此,例如,如果我的腳本返回4,則需要查找4,並返回5,如果我的腳本返回1,則返回3

我試過使用partners[mynumber][0],但問題是mynumber可能是任何一個值,而不只是第一個。

+0

客戶端是否可以有多個合作伙伴,或者是保證在該合作伙伴中唯一的號碼'夥伴'陣列? –

+0

有沒有可能讓「夥伴」聯合起來呢?我的意思是鑰匙是獨一無二的,對吧?否則,循環訪問數組,以便每個值都是那個小數組對,並檢查密鑰。 – EricG

+0

@ExplosionPills客戶只能有一個合作伙伴。 –

回答

1

好了,你必須尋找特定的陣列優先:

function partnerOf(someId) { 
    var res; 
    for (var i = 0, l = partners.length; i < l; i++) { 
    if (partners[i][0] === someId) { 
     res = partners[i][1]; 
     break; 
    } 
    } 
    return res; 
} 

...但它看起來(而且)是相當繁瑣的。另一種方法是重組partners結構,把它變成一個對象:

var partners = { 
    1: 3, 
    2: 6, 
    5: 4 
}; 

然後查找變得微不足道:您剛纔評估partners[someId],僅此而已。更可讀和更快的方式。

0

你可以做

var possiblePartners=partners[mynumber]; 
var partnerNum=(possiblePartners[0]==myNumber)?possiblePartners[1]:possiblePartners[0]; 

然而,做的最好的事情將是與你的合作伙伴的關聯數組,這樣

var partners={1:3,2:6,5:4}; 
var partnerNum=partners[mynubmber]; 
0

試試這個:

Array.prototype.different = function(arr2) { 
    var ret = []; 
    arr2.sort(); 
    for(var i = 0; i < this.length; i += 1) { 
     if(arr2.indexOf(this[i]) > -1){ 
      ret.push(this[i]); 
     } 
    } 
    return ret; 
}; 

使用這樣

console.log(yourArray1.different(yourArray2)); 
0

像這樣的東西可能會奏效:

function getPartner(/** int */ id) { 
    var group = partners.filter(function(group) { 
     return group[0] == id || group[1] == id; 
    })[0]; 
    return group[0] == id ? group[1] : group[0]; 
} 

這是什麼actuallyu作用是濾除小數組,直到只有正確夥伴組遺留下來,這就是發生的事情:

var group = partners.filter(function(group) { 
    return group[0] == id || group[1] == id; 
})[0]; 

的最後一步是尋找合作伙伴(而不是他自己),這樣做:

return group[0] == id ? group[1] : group[0]; 

這驗證,如果第一個元素是請求的ID,它返回第二個元素,否則將返回第一個元素。

我也做了一個工作JSFiddle來測試。

0

我會改變你的數據的結構,以方便合作伙伴找到

// defined partners DB 
var partners = {}; 

// adds a chat from c1 to c2 
function addChat(partners, c1, c2){ 
    partners[c1] = c2; 
    partners[c2] = c1; 
} 
function findChatPartner(partners, c1){ 
    return partners[c1]; 
} 
0

你可以使用一個for循環使用if/else語句組合

for (var i = 0, n = partners.length; i < n; i++) { 
    if (partners[i][0] === mynumber) 
     return partners[i][0]; 
    else if (partners[i][1] === mynumber) 
     return partners[i][1]; 
} 

它循環通過每個組直到找到mynumber,然後返回該集合中的另一個號碼