2017-01-06 6 views
-1

Я создаю приложение для Android, которое подключается к моему серверу node.js, который использует socket.io.Есть ли лучший способ добавить пользователя в объект/массив

Теперь у меня нет никаких проблем, но я чувствую, что есть лучший способ сделать это. Приведенный ниже код добавляет пользователя к переменной userPool на основе местоположения пользователя/страны/города пользователя.

var userPool = {}; 

// Adds the user to the pool object 
socket.on('add or update user to pool', function(data) { 
    if (userPool.hasOwnProperty(data['country'])) { 
    if (userPool[data['country']].hasOwnProperty(data['state'])) { 
     if (userPool[data['country']][data['state']].hasOwnProperty(data['city'])) { 
     if (userPool[data['country']][data['state']][data['city']].hasOwnProperty(data['user_type'])) { 
      userPool[data['country']][data['state']][data['city']][data['user_type']][socket.id] = data; 
     } 
     else { 
      userPool[data['country']][data['state']][data['city']][data['user_type']] = {}; 
      userPool[data['country']][data['state']][data['city']][data['user_type']][socket.id] = data; 
     } 
     } 
     else { 
     userPool[data['country']][data['state']][data['city']] = {}; 
     userPool[data['country']][data['state']][data['city']][data['user_type']] = {}; 
     userPool[data['country']][data['state']][data['city']][data['user_type']][socket.id] = data; 
     } 
    } 
    else { 
     userPool[data['country']][data['state']] = {}; 
     userPool[data['country']][data['state']][data['city']] = {}; 
     userPool[data['country']][data['state']][data['city']][data['user_type']] = {}; 
     userPool[data['country']][data['state']][data['city']][data['user_type']][socket.id] = data; 
    } 
    } 
    else { 
    userPool[data['country']] = {}; 
    userPool[data['country']][data['state']] = {}; 
    userPool[data['country']][data['state']][data['city']] = {}; 
    userPool[data['country']][data['state']][data['city']][data['user_type']] = {}; 
    userPool[data['country']][data['state']][data['city']][data['user_type']][socket.id] = data; 
    } 

    if (!socket.hasOwnProperty('userInfo')) 
    socket['userInfo'] = { 'country': data['country'], 'state': data['state'], 'city': data['city'], 'user_type': data['user_type'] }; 

}); 
+0

Немного трудно следовать, но я заметил много кода повторения. Как бы вы ни старались, постарайтесь не повторять себя. – deweyredman

+1

Не следует ли это задавать в [CodeReview] (http://codereview.stackexchange.com/)? – Xufox

ответ

2

, что о чем-то вроде этого:

let userPool = {}; 

socket.on('add or update user to pool', addUserToPool); 

function addUserToPool (data) { 
    let country  = data['country'] 
     , state  = data['state'] 
     , city  = data['city'] 
     , user_type = data['user_type']; 

    userPool[country] = userPool[country] || {}; 
    userPool[country][city] = userPool[country][city] || {}; 
    userPool[country][city][user_type] = userPool[country][city][user_type] || {}; 

    let userTypes = userPool[country][city][user_type]; 

    userTypes[socket.id] = data; 
} 
1

К счастью, есть библиотеки, которые позаботятся об этой работе. Если я правильно следуя вашей логике:

import extend from 'deep-extend'; 

socket.on('add or update user to pool', (data) => { 
    userPool = extend(userPool, { 
    [data.country]: { 
     [data.state]: { 
     [data.city]: { 
      [data.user_type]: { 
      [socket.id]: data 
      } 
     } 
     } 
    } 
    }); 
}); 
Смежные вопросы