2013-12-18 3 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

Может ли клиент иметь несколько партнеров или числа, гарантированные уникальными в массив 'partners'? –

+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 (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, а затем вернет другое число в этом наборе

Смежные вопросы