2013-12-18 122 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,然后返回该集合中的另一个号码