2016-08-19 2 views
0

개체를 매핑하고 배열을 통해 실행합니다. 동일한 키가 있으면 해당 개체에 대해 개체를 만듭니다.배열에 특정 키 확장 개체가있는 경우 배열에 개체 넣기

나는 이제 그 사용자 객체를 배열로 푸시하기 전에 해당 사용자가 이미 해당 배열에 존재하는지 확인하고 싶습니다. 그렇다면 네 개의 객체로 날짜를 확장하면됩니다. 그렇지 않으면 객체를 배열로 밀어 넣습니다.

그러나 현재 결과는 빈 배열이며이 문제를 해결하는 방법을 모르겠습니다. 정확히 바이올린의 주석으로 언급 작동하지 않는 것 : 결과는 각 위해 userLogin 한 번만 존재와 객체를 포함하는 배열이

var allUser = [ 
 
    { "userLogin": "t.test" }, 
 
    { "userLogin": "a.test" }, 
 
    { "userLogin": "b.test" } 
 
]; 
 

 
var userFound = ["t.test","a.test"] 
 

 
var requestByRange = [{ 
 
    "dateFrom": "2016-09-01", 
 
    "dateTo": "2016-09-13", 
 
    "userID": "13", 
 
    "userLogin": "t.test" 
 
}, { 
 
    "dateFrom": "2016-09-09", 
 
    "dateTo": "2016-09-16", 
 
    "userID": "16", 
 
    "userLogin": "t.test" 
 
}, { 
 
    "dateFrom": "2016-09-08", 
 
    "dateTo": "2016-09-23", 
 
    "userID": "16", 
 
    "userLogin": "a.test" 
 
}]; 
 

 
var usersToDisplay = []; 
 
     if (userFound.length != 0 && requestByRange != undefined) { 
 
      allUser.map(function (value, index) { 
 
       for (var i = 0; i < userFound.length; i++) { 
 
        if (value.userLogin === userFound[i]) { 
 
         for(var key in requestByRange){ 
 
          if(requestByRange.hasOwnProperty(key) && key.indexOf(value.userLogin) === -1){ 
 
           //console.log("yipia") 
 
           //console.log(key) 
 
           //console.log(requestByRange[key].dateFrom) 
 
           //console.log(requestByRange[key].dateTo) 
 
           //console.log(value) 
 

 
           var userToDisplay = { 
 
            userLogin: value.userLogin, 
 
            dateFrom: [requestByRange[key].dateFrom], 
 
            dateTo: [requestByRange[key].dateTo] 
 
           } 
 

 
           /* 
 
           THE PART BELOW DOES NOT WORK!!! 
 
           If userToDisplay.userLogin is already in usersToDisplay 
 
           Push the dates in dateFrom and dateTo, otherwise 
 
           push the userToDisplay Object into the usersToDisplay array 
 
           
 
           Current output is an empty array 
 
           */ 
 
           console.log("--------------------------------------") 
 
           for(var usersKey in usersToDisplay){ 
 
            console.log(usersToDisplay[usersKey]) 
 
            if(usersToDisplay.hasOwnProperty(usersKey) && usersKey.indexOf(usersToDisplay.userLogin) === -1){ 
 
             console.log("ja"); 
 
             console.log(usersToDisplay[usersKey]) 
 
             usersToDisplay[usersKey].dateFrom.push(userToDisplay.dateFrom) 
 
             usersToDisplay[usersKey].dateTo.push(userToDisplay.dateTo) 
 
            }else{ 
 
             console.log("--------------------------------------") 
 
             usersToDisplay.push(userToDisplay); 
 
            } 
 
           } 
 
          } 
 
         } 
 
        } 
 
       } 
 
      }); 
 
     } 
 
     
 
     console.log(usersToDisplay)

Fiddle

이 사용자에 속하는 해당 객체의 배열로 모두 dateFrom & dateTo입니다.

var usersToDisplay = [ 
    { 
     "dateFrom": ["2016-09-01", "2016-09-09"], 
     "dateTo": ["2016-09-13, "2016-09-16], 
     "userID": "16", 
     "userLogin": "t.test" 
    } 
    ] 
+0

원하는 결과를 추가하시기 바랍니다. –

+0

나는 평범한 설명이 아니라 문자 그대로를 추가하십시오. –

+0

이 당신을 위해이 ok입니까? – BayLife

답변

0

이게 필요한가요? 범위 배열을 먼저 매핑 했으므로 너무 많은 루프를 중첩 할 필요가 없습니다. 이것은 userFound의 모든 사용자가 범위 배열에 적어도 하나의 레코드를 가지고 있다고 가정합니다. 범위가 없으면 기본값을 사용하도록 쉽게 편집 할 수 있습니다.

// Your inputs 
var allUser = [ 
     { "userLogin": "t.test" }, 
     { "userLogin": "a.test" }, 
     { "userLogin": "b.test" } 
    ], 
    userFound = ["t.test","a.test"], 
    requestByRange = [{ 
     "dateFrom": "2016-09-01", 
     "dateTo": "2016-09-13", 
     "userID": "13", 
     "userLogin": "t.test" 
    }, { 
     "dateFrom": "2016-09-09", 
     "dateTo": "2016-09-16", 
     "userID": "16", 
     "userLogin": "t.test" 
    }, { 
     "dateFrom": "2016-09-08", 
     "dateTo": "2016-09-23", 
     "userID": "16", 
     "userLogin": "a.test" 
    }], 
    // Helpers 
    rangesPerUser = requestByRange.reduce(function(map, record) { 
     var login = record.userLogin; 
     if (!map[login]) map[login] = []; 
     map[login].push(record); 
     return map; 
    }, {}), 
    result = []; 

allUser.forEach(function(user) { 
    var login = user.userLogin, 
     record; 
    if (userFound.indexOf(login) !== -1) { 
     record = { 
      'userID' : rangesPerUser[login][0].userID, 
      'userLogin' : login, 
      'dateFrom' : [], 
      'dateTo' : [] 
     }; 
     rangesPerUser[login].forEach(function(range) { 
      record.dateFrom.push(range.dateFrom); 
      record.dateTo.push(range.dateTo); 
     }); 
     result.push(record); 
    } 
}); 
+0

고마워,이 일은 나를 위해 일했다! – BayLife

1

지도를 만들어 결과 집합의 항목에 대한 참조로 사용할 수 있습니다.

var allUser = [{ "userLogin": "t.test", }, { "userLogin": "a.test", }, { "userLogin": "b.test", }], 
 
    userFound = ["t.test", "a.test"], 
 
    requestByRange = [{ "dateFrom": "2016-09-01", "dateTo": "2016-09-13", "userID": "13", "userLogin": "t.test" }, { "dateFrom": "2016-09-09", "dateTo": "2016-09-16", "userID": "16", "userLogin": "t.test" }, { "dateFrom": "2016-09-08", "dateTo": "2016-09-23", "userID": "16", "userLogin": "a.test" }], 
 
    map = new Map, 
 
    result = allUser.map(function (a) { 
 
     var o = {}; 
 
     Object.assign(o, a); 
 
     map.set(a.userLogin, o); 
 
     return o; 
 
    }); 
 

 
requestByRange.forEach(function (a) { 
 
    var o = map.get(a.userLogin); 
 
    if (!o) { 
 
     o = {}; 
 
     Object.assign(o, a); 
 
     map.set(a.userLogin, o); 
 
     result.push(o); 
 
    } 
 
    o.dateFrom = o.dateFrom || []; 
 
    o.dateFrom.push(a.dateFrom); 
 
    o.dateTo = o.dateTo || []; 
 
    o.dateTo.push(a.dateTo); 
 
    o.userID = o.userID || a.userID; 
 
}); 
 

 
console.log(result);