2014-06-21 2 views
0

예 객체 데이터를 병합하는 방법 :여러 개체에 걸쳐

USA 
Jimmy, Serena, Richard 

Canada 
Jimmy, Serena 

Japan 
Serena, Richard 

Thailand 
Serena 

China 
Richard 

United Kingdom 
Jimmy, Richard 

Germany 
Rachel 

은 다음과 같습니다 같을 것이다

{ 
people: [ 
    { 
    "Name": "Jimmy", 
    "Place": ["USA", "Canada", "United Kingdom"] 
    }, 
    { 
    "Name": "Serena", 
    "Place": ["USA", "Japan", "Canada", "Thailand"] 
    }, 
    { 
    "Name": "Richard", 
    "Place": ["USA", "Japan", "China", "United Kingdom"] 
    }, 
    { 
    "Name": "Rachel", 
    "Place": ["Germany"] 
    } 
] 
} 

나는 각각의 장소를 표시해야이 객체를 사용하고 그 장소와 관련된 이름을 내 현재 진행 상황.

제한된 JavaScript 환경에서이 작업을 수행하는 방법을 알아낼 수 없습니다. 밑줄을 사용하여 각 사람의 이름과 그 사람이 있었던 장소를 표시하는 방법을 알아 냈습니다.하지만 원하는 것은 아닙니다. 위에 표시된대로 병합해야합니다. 여기에

출력
_.each(people, function (value, key) { 
    var name = person[key].Name; 
    var place = person[key].Place; 
    return name + '<br>' + place; 
}); 

...

Jimmy 
USA,Canada,United Kingdom 

Serena 
USA,Japan,Canada,Thailand 

Richard 
USA,Japan,China,United Kingdom 

Rachel 
Germany 

사람이 도움이 될 수 ... 내가 지금까지 함께 왔어요 무슨 일이야? 밑줄을 사용하여 답변을 선호하지만 JavaScript의 다른 형식을 사용할 수 있습니다.

답변

1

모든 국가의 배열을 구문 분석하고 일치하는 이름을 추가하십시오. 두 중첩 루프 충분합니다 : 일치하는 경우 장소 및 인쇄 이름을 통해 제 루프 장소를 병합

var arr = [/*...*/];// initial array 

// object stores the target structure 
var store = {}; 

// for every person in the list .. 
arr.forEach(function(person) { 
    // for every country, the person has visited 
    person.Place.forEach(function(place) { 
     // does the store know the country? 
     if (!store.hasOwnProperty(place)) { 
      // no, create it 
      store[place] = []; 
     } 
     // add the person the the country 
     store[place].push(person.Name); 
    }); 
}); 

console.log(store); 

demo jsfiddle

0

당신의 필요 :

var _ = require('underscore'); 
var places = []; 
var os = require('os'); 
var i, j, len, len1, names; 

for (i = 0, len = people.length; i < len; i++) { 
    places = _.union(places, people[i].Place); 
} 
for (i = 0, len = places.length; i < len; i++) { 
    console.log(places[i]); 
    names = [] 
    for (j = 0, len1 = people.length; j < len1; j++) { 
    if (_.indexOf(people[j].Place, places[i]) >= 0) { 
     names.push(people[j].Name); 
    } 
    } 
    console.log(" " + names.join(', ') + os.EOL); 
} 
+0

@Barry 앤더스을 : 내가 사용할 수도 _. 각 'for'루프의 각()하지만이 경우에는 루프에만 사용하는 속도와 메모리 측면에서 더 효율적입니다. – Ben

관련 문제