2016-03-10 2 views
-1

У меня есть два user_ids. Мне нужно выяснить, есть ли у меня два пользовательских_пользователя, которые уже принадлежат разговору.Найти совпадающие значения в вложенном массиве javascript

Скажем, я хочу найти найденный ниже массив для разговора между user_id 7 и 4. Он будет пустым, потому что 7 и 4 не принадлежат к разговору. Если бы я искал 7 и 8, он возвращал массив.

Я открыт для lodash и примеров с одним лайнером.

[ 
    [{ 
     "full_name": "Bob", 
     "id": 7, 
     "user_conversations": { 
      "user_id": 7, 
      "conversation_id": 1 
     } 
    }, { 
     "full_name": "Sally", 
     "id": 8, 
     "user_conversations": { 
      "user_id": 8, 
      "conversation_id": 1 
     } 
    }], 
    [{ 
     "full_name": "Suzy", 
     "id": 6, 
     "user_conversations": { 
      "user_id": 6, 
      "conversation_id": 2 
     } 
    }, { 
     "full_name": "Bob", 
     "id": 7, 
     "user_conversations": { 
      "user_id": 7, 
      "conversation_id": 2 
     } 
    }] 
] 
+0

Вернуть массив чего? – Marty

+1

Перейдите через массив, создав массив разговоров, в котором находится 7, и массив цепочек, в которых находится 4. В этом случае проверьте, имеют ли два массива общие значения. – Barmar

ответ

0
var data = [ 
    [{ 
     "full_name": "Bob", 
     "id": 7, 
     "user_conversations": { 
      "user_id": 7, 
      "conversation_id": 1 
     } 
    }, { 
     "full_name": "Sally", 
     "id": 8, 
     "user_conversations": { 
      "user_id": 8, 
      "conversation_id": 1 
     } 
    }], 
    [{ 
     "full_name": "Suzy", 
     "id": 6, 
     "user_conversations": { 
      "user_id": 6, 
      "conversation_id": 2 
     } 
    }, { 
     "full_name": "Bob", 
     "id": 7, 
     "user_conversations": { 
      "user_id": 7, 
      "conversation_id": 2 
     } 
    }] 
]; 

var relations = {}; 

var addRelation = function(pers1, pers2, conv_id) { 
    if (!relations[pers1]) { 
     relations[pers1] = {}; 
    } 
    if (!relations[pers1][pers2]) { 
     relations[pers1][pers2] = []; 
    } 
    relations[pers1][pers2].push(conv_id); 
}; 

var checkForRelation = function(pers1, pers2) { 
    if (relations[pers1] && relations[pers1][pers2]) { 
     return relations[pers1][pers2]; 
    } else { 
     return []; 
    } 
}; 

for (var i = 0; i < data.length; i++) { 
    var tmp = data[i]; 
    var conv_id = tmp[0].user_conversation.conversation_id; 
    var pers1 = tmp[0].id; 
    var pers2 = tmp[1].id; 

    addRelation(pers1, pers2, conv_id); 
    addRelation(pers2, pers1, conv_id); 
} 
  1. создать объект для проведения беседы 'отношения' для каждого пользователя.
  2. Итерация по структуре данных для каждого массива в массиве данных создает связь между user1 и user2 и наоборот.

Так отношения будут в конечном итоге выглядит так:

{ 
    "7": { 
     "8": ['1'], 
     "6": ['2'] 
    }, 
    "8": { 
     "7": ['1'] 
    }, 
    "6": { 
     "7": ['2'] 
    } 
} 

checkForRelations то просто делает поиск структуры отношений между человеком одного человека два.

0

Вот lodash крайне лаконична версия:

_.pickBy(_.zipObject(_.map(data, '[0]user_conversations.conversation_id'), 
        _.map(data, _.partial(_.map, _, 'id'))), 
     function (p) { 
    return _.intersection(p, [7, 8]).length == 2; 
}); 

Объяснение:

var data = [ 
 
    [{ 
 
    "full_name": "Bob", 
 
    "id": 7, 
 
    "user_conversations": { 
 
     "user_id": 7, 
 
     "conversation_id": 1 
 
    } 
 
    }, { 
 
    "full_name": "Sally", 
 
    "id": 8, 
 
    "user_conversations": { 
 
     "user_id": 8, 
 
     "conversation_id": 1 
 
    } 
 
    }], 
 
    [{ 
 
    "full_name": "Suzy", 
 
    "id": 6, 
 
    "user_conversations": { 
 
     "user_id": 6, 
 
     "conversation_id": 2 
 
    } 
 
    }, { 
 
    "full_name": "Bob", 
 
    "id": 7, 
 
    "user_conversations": { 
 
     "user_id": 7, 
 
     "conversation_id": 2 
 
    } 
 
    }] 
 
]; 
 

 
// get all conversation ids in order 
 
var conversations = _.map(data, '[0]user_conversations.conversation_id'); 
 

 
// get all conversations' participants' user ids in order 
 
var participants = _.map(data, _.partial(_.map, _, 'id')); 
 

 
// create an object that maps conversation ids to their participants' user ids 
 
var convToUsers = _.zipObject(conversations, participants); 
 

 
// now pick the conversations that include the participants you want: 
 
var picked = _.pickBy(convToUsers, function (p) { 
 
    return _.intersection(p, [7, 8]).length == 2; 
 
}); 
 

 
_.forEach(picked, function (parts, conv) { 
 
    document.write('<pre>Conversation ' + conv + ' has participants ' + 
 
     JSON.stringify(parts) + '</pre>'); 
 
});
<script src="https://cdn.jsdelivr.net/lodash/4.6.1/lodash.min.js"></script>

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