2017-03-28 4 views
-2

가정하자 나는이 이런 JS 배열 :자바 스크립트 배열은 독특한 배열을 얻을 요소를 결합

[ 
    { 
    "lat": 49.26125, 
    "lon": -123.24807, 
    "weight": 120 
    }, 
    { 
    "lat": 49.26125, 
    "lon": -123.24807, 
    "weight": 80 
    }, 
    { 
    "lat": 49.26125, 
    "lon": -123.24807, 
    "weight": 160 
    }, 
    { 
    "lat": 49.26229, 
    "lon": 23.24342, 
    "weight": 236 
    }, 
    { 
    "lat": 49.26229, 
    "lon": 23.24342, 
    "weight": 167 
    } 
] 

은 가정하자 내가 위도 같은 & 있는 무게의 요소를 추가 할

[ 
    { 
    "lat": 49.26125, 
    "lon": -123.24807, 
    "weight": 360 
    }, 
    { 
    "lat": 49.26229, 
    "lon": 23.24342, 
    "weight": 403 
    } 
] 

JS에서 그렇게하는 효율적인 방법은 무엇입니까 : 경도 이런 식으로 뭔가를 얻으려면?

+1

이봐, 나, 우리는 추가 지원을 할 수 있습니다. – fubar

답변

0

당신은 총 weight를 축적 병합 된 개체에 고유 [lat, lon]쌍에서지도를 형성하기 위해 배열을 -ing reduce하여이 작업을 수행 할 수 있습니다. 결과는 해당지도가 보유한 값 목록 (Object.keysArray#map을 사용하여 얻을 수 있음)입니다.

var array = [{lat:49.26125,lon:-123.24807,weight:120},{lat:49.26125,lon:-123.24807,weight:80},{lat:49.26125,lon:-123.24807,weight:160},{lat:49.26229,lon:23.24342,weight:236},{lat:49.26229,lon:23.24342,weight:167}] 
 

 
var map = array.reduce(function (map, o) { 
 
    var k = [o.lat, o.lon].join() 
 
    
 
    if (k in map) 
 
    map[k].weight += o.weight 
 
    else 
 
    map[k] = o 
 
    
 
    return map 
 
}, {}) 
 

 
var result = Object.keys(map).map(function (k) { return map[k] }) 
 

 
console.log(result)
.as-console-wrapper { min-height: 100%; }

0

클로저로 해시 테이블을 사용하고 latlon을 키로 사용할 수 있습니다.

그런 다음 해시가 존재하는지 확인하고 데이터로 새 개체를 생성하지 않고 결과 집합으로 밀어 넣으십시오.

나중에 해시 된 객체의 속성에 weight을 추가하십시오.

var data = [{ lat: 49.26125, lon: -123.24807, weight: 120 }, { lat: 49.26125, lon: -123.24807, weight: 80 }, { lat: 49.26125, lon: -123.24807, weight: 160 }, { lat: 49.26229, lon: 23.24342, weight: 236 }, { lat: 49.26229, lon: 23.24342, weight: 167 }], 
 
    result = data.reduce(function (hash) { 
 
     return function (r, a) { 
 
      var key = ['lat', 'lon'].map(function (k) { return a[k]; }).join('|'); 
 
      if (!hash[key]) { 
 
       hash[key] = { lat: a.lat, lon: a.lon, weight: 0 }; 
 
       r.push(hash[key]); 
 
      } 
 
      hash[key].weight += a.weight; 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

은 당신이 뭔가를 할 수 있습니다. 그렇게 효율적이지는 않지만 작동합니다. 당신은 당신이 지금까지 시도했다 게시 할 경우

var arr = [{ lat: 49.26125, lon: -123.24807, weight: 120 }, { lat: 49.26125, lon: -123.24807, weight: 80 }, { lat: 49.26125, lon: -123.24807, weight: 160 }, { lat: 49.26229, lon: 23.24342, weight: 236 }, { lat: 49.26229, lon: 23.24342, weight: 167 }]; 
 

 
arr = arr.reduce(function(accumulation, currentElement){ 
 
    var samePosition = accumulation.find(function(obj){ 
 
     return obj.lat === currentElement.lat && obj.lng === currentElement.lng; 
 
    }); 
 
    if(samePosition){ 
 
     samePosition.weight += currentElement.weight; 
 
    }else{ 
 
     accumulation.push(currentElement); 
 
    } 
 
    return accumulation; 
 
}, []); 
 

 
console.log(arr);
Array.prototype.reduce에서