2014-12-30 2 views
-2

두 개의 오브젝트 배열이 있습니다. 그들 중 하나는 하루에 방문자 수를 가지며, 다른 하나는 하루에 문서 수를가집니다. 이와 같이 :고유 키로 오브젝트 배열 결합

var visitors = [ { '2014.12.25': 141 }, { '2014.12.26': 630 }, { '2014.12.30': 71 } ]; 
var documents = [ { '2014.12.15': 31 }, { '2014.12.26': 60, }, { '2014.12.30': 95 } ]; 

날짜는 각 배열마다 다를 수 있습니다. 어떻게 (날짜 키에 의해 그들을 결합을 의미) 다음과 같은 구조로 배열을 변환 할 수 있습니다 : 허용

[ { date: '2014.12.15', visits: 0, docs: 31 }, // here visits = 0 because there were no visitors at this date 
    { date: '2014.12.25', visits: 441, docs: 0 }, // here docs = 0 because no docs were created at this date 
    { date: '2014.12.26', visits: 630, docs: 60 }, 
    { date: '2014.12.30', visits: 71, docs: 95 },  
] 

도구 : JavaScriptUndescore.js을.

고맙습니다.

+0

, 내 코드는 지금이 문제를 해결하기 위해 2 개 이상의 페이지가, 많은 것들을 시도,하지만 난 권리를 갈거야 의심 방법. 나는 매끄러운 솔루션 커뮤니티가 알고 있다고 믿습니다. – kaytrance

+0

그래,이 코드는 10 줄 미만의 코드 여야합니다 ... – Cerbrus

+0

문제를 해결하기 위해 최대 두 페이지의 코드를 작성하면 [KISS 원칙] (http : /en.wikipedia.org/wiki/KISS_principle)는 완전히 무시되었습니다. – Sukima

답변

1

기본 JS에서 시작해 보겠습니다.

먼저, 분별있는 객체로 그 두 배열을 돌려 보자 :

var combined = {}; 
for(var key in v){ 
    combined[key] = { date: key, visits: v[key], docs: 0 }; 
} 
for(var key in d){ 
    combined[key] = combined[key] || { date: key, visits: 0 }; 
    combined[key].docs = d[key]; 
} 

이제 combined는 데이터를 포함하는 아주 좋은 목적은 다음과 같습니다

function reduceDates(prev, curr){ 
    var date = Object.keys(curr)[0]; // This is why {date : value} makes no sense. 
    prev[date] = curr[date]; 
    return prev; 
} 

var v = visitors.reduce(reduceDates, {}); // {2014.12.25: 141, 2014.12.26: 630, 2014.12.30: 71} 
var d = documents.reduce(reduceDates, {}); // {2014.12.15: 31, 2014.12.26: 60, 2014.12.30: 95} 

은 이제 하나의 객체로 그 둘을 결합하자 :

{ 
    "2014.12.25": { date: "2014.12.25", visits: 141, docs: 0 }, 
    "2014.12.26": { date: "2014.12.26", visits: 630, docs: 60 }, 
    "2014.12.30": { date: "2014.12.30", visits: 71, docs: 95 }, 
    "2014.12.15": { date: "2014.12.15", visits: 0, docs: 31 } 
} 

그러나 개체 배열이 필요하기 때문에 가지고가는 하나 더 많은 시간을 반복하기 :

var result = []; 
for(var key in combined){ 
    result.push(combined[key]); 
} 

결과 :

[ 
    { date: "2014.12.25", visits: 141, docs: 0 }, 
    { date: "2014.12.26", visits: 630, docs: 60 }, 
    { date: "2014.12.30", visits: 71, docs: 95 }, 
    { date: "2014.12.15", visits: 0, docs: 31 } 
] 

물론,이 짧은 아니거나 원하는 결과를 얻을 수있는 가장 좋은 방법,하지만 난 당신에게를 제공 희망 이 과정에 관련된 단계의 아이디어.

+0

훌륭한 답변입니다! – kaytrance

+0

Downvoter : 관심있는 댓글? 내가 실수를했다면, 그걸로 배우고 싶습니다. – Cerbrus

0

데이터를 반복하면됩니다.

var visitors = [ { '2014.12.25': 141 }, { '2014.12.26': 630 }, { '2014.12.30': 71 } ]; 
var documents = [ { '2014.12.15': 31 }, { '2014.12.26': 60, }, { '2014.12.30': 95 } ]; 
var data = {}; 
visitors.forEach(function(el){var k = Object.keys(el)[0]; data[k] = data[k] || {}; data[k].visits = el[k];}); 
documents.forEach(function(el){var k = Object.keys(el)[0]; data[k] = data[k] || {}; data[k].docs = el[k];}); 
for(prop in data){ 
    if(data[prop].docs === void 0){data[prop].docs = 0}; 
    if(data[prop].visits === void 0){data[prop].visits = 0}; 
} 

이것은 데이터를 결합 된 방식으로 제공하기 때문에 키를 속성에서 날짜로 이동하는 논리를 추가하기 만하면됩니다.

+0

'void 0'? 정말? – Cerbrus

+0

@Cerbrus'void 0'은 완전히 유효한 사용법입니다. 나는 당신의 요점이 무엇인지 모르겠습니다. – Nit

+0

물론 유효하지만 JS에 익숙하지 않은 사람들이 편집증에 익숙하지 않을 수도 있습니다. – Cerbrus

0

배열 결합 밑줄 사용하여 또 다른 방법 : 물론

var visitors = [ { '2014.12.25': 141 }, { '2014.12.26': 630 }, { '2014.12.30': 71 } ]; 
var documents = [ { '2014.12.15': 31 }, { '2014.12.26': 60, }, { '2014.12.30': 95 } ]; 

var visits = new Array(); 
var docs = new Array(); 

for (i=0; i < visitors.length; i++) { 
    for (key in visitors[i]) {  
     visits.push({"date": key, "visits": visitors[i][key], "docs":0}); 
    } 
} 

for (i=0; i < documents.length; i++) { 
    for (key in documents[i]) { 
     docs.push({"date": key,"docs": documents[i][key]}); 
    } 
} 

mergeByProperty(visits, docs, 'date'); 

function mergeByProperty(visits, docs, prop) { 
    _.each(docs, function(arr2obj) { 
     var arr1obj = _.find(visits, function(arr1obj) { 
      return arr1obj[prop] === arr2obj[prop]; 
     }); 

     //If the object already exist extend it with the new values from arr2, otherwise just add the new object to arr1 
     arr1obj ? _.extend(arr1obj, arr2obj) : visits.push(arr2obj); 
    }); 
} 

console.log(visits);