2012-12-18 26 views
0

我有對象的像這樣的一個陣列:薩姆值時的其他屬性的值是相同的

{'shapeId': 'shapeid1', 'latlong': '45.42342,-65.23424', 'number': 5} 

我希望屬性number的值的總和時的值屬性shapeId是一樣的。

是否有內置的方法呢?謝謝!

我到目前爲止試過的是這樣的,使用reduce()方法,但是當函數調用很多次時結果很奇怪。

function selectMarkersInPoly() { 
     allTotal = new Array(); 
     alert(allMarkers.length) 
     for (var i=0; i < createdShapes.length; i++) { 
      for (var j=0; j < allMarkers.length; j++){ 
       var latlong = allMarkers[j].getPosition(); 
       if(google.maps.geometry.poly.containsLocation(latlong, createdShapes[i]) == true) { 
        allMarkers[j].setOptions({ 
         icon : "http://labs.google.com/ridefinder/images/mm_20_white.png", 
         shapeId:createdShapes[i].id 
        }); 
       }else{ 
        allMarkers[j].setOptions({ 
         icon : "http://labs.google.com/ridefinder/images/mm_20_red.png", 
         shapeId: 'shapeid0' 
        }); 
       }  
      } 
     }    
     allTotal = allMarkers.reduce(function(res, obj) { 
      if (!(obj.shapeId in res)){ 
      res.__array.push(res[obj.shapeId] = obj); 
      }else { 
      res[obj.shapeId].number += obj.number; 
      } 
      return res; 
      }, {__array:[]}).__array 
       .sort(function(a,b) { return b.shapeId - a.shapeId; 
      }); 

      for (var j=0; j < allTotal.length; j++) { 
      alert(allTotal[j].shapeId + ': ' + allTotal[j].number) 
      } 
    } 

在3505個對象中,所有馬克筆中總共有32600個數字。我第一次打電話我得到的功能:

allTotal= [ 
    Object { number=32598, shapeId='shapeid0'}, 
    Object { number=2, shapeId='shapeid1'} 
] 

其中shapeid0未被選中。我第二次調用該函數不改變任何東西,我得到:

allTotal= [ 
    Object { number=65193, shapeId='shapeid0'}, 
    Object { number=2, shapeId='shapeid1'} 
] 

而第三次:

allTotal= [ 
    Object { number=97788, shapeId='shapeid0'}, 
    Object { number=2, shapeId='shapeid1'} 
] 
+0

顯然數量由每次32595往上走。這有幫助嗎? – ErikE

+0

奇怪,因爲allMarkers中的總數是32600,shapeid1中的選擇是2. 32600-2 = 32598. Shapeid0 =未選中 –

+1

請更好地設置您的js的格式! – ErikE

回答

2

你的代碼是一個有點古怪的格式。但是,問題在於在res.__array.push(res[obj.shapeId] = obj);表達式中,您將對象本身分配給res,而不是克隆。隨着res[obj.shapeId].number += obj.number;您然後操縱原始對象,這就是爲什麼結果在隨後的調用中增長。

更好:

var numberSums = allMarkers.reduce(function(res, obj) { 
    var id = obj.shapeId; 
    if (id in res) 
     res[id] += obj.number; 
    else 
     res[id] = obj.number; 
    return res; 
}, {}); 
Object.keys(numberSums).sort(function(a,b){return a-b;}).forEach(function(id) { 
    alert(id+": "+numberSums[id]); 
}); 
+0

謝謝!它正是解決方案。 –