有效地基于属性的Javascript对象和值

有效地基于属性的Javascript对象和值,javascript,arrays,performance,object,Javascript,Arrays,Performance,Object,我在JS中的数组中有三个对象,如下所示 [{"2013-03-02T00:00": 300}, {"2013-03-01T00:00": 200},{"2013-03-02T00:00": 50}] 我想从上面的数组中输出如下内容 [{"2013-03-02T00:00": 350} , {"2013-03-01T00:00": 200}] 它可以通过循环和添加来完成,我有什么有效的方法可以做到吗 提前感谢。var myList=[{“2013-03-02T00:00”:300},{“201

我在JS中的数组中有三个对象,如下所示

[{"2013-03-02T00:00": 300}, {"2013-03-01T00:00": 200},{"2013-03-02T00:00": 50}]
我想从上面的数组中输出如下内容

[{"2013-03-02T00:00": 350} , {"2013-03-01T00:00": 200}]
它可以通过循环和添加来完成,我有什么有效的方法可以做到吗

提前感谢。

var myList=[{“2013-03-02T00:00”:300},{“2013-03-01T00:00”:200},{“2013-03-02T00:00”:50};
var myList = [{"2013-03-02T00:00": 300}, {"2013-03-01T00:00": 200},{"2013-03-02T00:00": 50}];
var result = {};
var item = null, key = null;
for(c=0; c<myList.length; c++) {
   item=myList[c];
   key = Object.keys(item)[0];
   item=item[key];

   if(!result[key]) result[key] = item;
   else result[key] += item;
}

console.log(result);
var result={}; var item=null,key=null;
对于(c=0;c,您可能需要看一看,它有许多有用的、高效的函数的实现,用于操作和处理数据。具体来说,您需要看一看
\uuu.groupBy
函数:

var data = [{"2013-03-02T00:00": 300}, {"2013-03-01T00:00": 200},{"2013-03-02T00:00": 50}]
_.groupBy(data, function(obj) { return Object.keys(obj)[0]; })
您仍然需要对值进行迭代和求和,但这就是我们使用reduce函数的原因

如果您想要更具体的用例,我会看看github上的源代码

如果可以将键“date”添加为对象的另一个值,则可以对其进行排序和分组,当数组中有更多值时,这将更快、更优化

[更新]:修复了一个小错误

var arr = [{"date":"2013-03-02T00:00",val: 300}
 , {"date":"2013-03-01T00:00",val: 200}
 ,{"date":"2013-03-02T00:00",val: 50}];
function groupArray(arr){
  if(arr.length===0){return [];}
  var pref,i;
  // sort by date
  arr.sort(function(a,b){
    return (a.date>b.date)?1:(a.date<b.date)?-1:0; 
  });
  // loop through the array grouping objects by date
  pref=arr[0].date;
  for(i=1;i<arr.length;i++){
    if(arr[i].date===pref){
      //set the total
      arr[i-1].val=arr[i-1].val+arr[i].val;
      //remove the element
      arr.splice(i,1);
      // set i one back
      i--;
    }
    pref=arr[i].date;
  }
  return arr;
}
console.log(groupArray(arr));
var arr=[{“日期”:“2013-03-02T00:00”,val:300}
,{“日期”:“2013-03-01T00:00”,val:200}
,{“日期”:“2013-03-02T00:00”,val:50}];
函数组数组(arr){
如果(arr.length==0){return[];}
var-pref,i;
//按日期排序
arr.sort(函数(a,b){

return(a.date>b.date)?1:(a.date你在这里面添加了什么?你能更新你的问题使其更具描述性吗?啊,我明白了。你的问题有点不清楚,但你基本上想添加所有类似的键。你还能将数组更改为包含以下内容的项吗:{'date':“2013-03-02T00:00”,值:300}这将更容易对项目进行分组和添加值,因为您可以按日期对数组进行排序,并一下子获得相同的值。您可以使用array.map()..@DavidZiemann,但只能使用一点?您的变量c在for循环中未定义,无法编辑,因为需要编辑的字符数最少
var arr = [{"date":"2013-03-02T00:00",val: 300}
 , {"date":"2013-03-01T00:00",val: 200}
 , {"date":"2013-03-01T00:00",val: 200}
 , {"date":"2013-03-01T00:00",val: 200}
 , {"date":"2013-03-01T00:00",val: 200}
 ,{"date":"2013-03-02T00:00",val: 50}];
/**
* @param arr is the array to be merged
* @param key is the key to use for merge 
*   (like date) will merge on items with same 
*   date value
* @param onMerge function to call when 2 items
*    are merged with the 2 items as parameters
**/
function groupArray(arr,key,onMerge){
  if(arr.length===0){return [];}
  var pref,i;
  // sort by key
  arr.sort(function(a,b){
    return (a[key]>b[key])?1:(a[key]<b[key])?-1:0; 
  });
  // loop through the array grouping objects by key
  pref=arr[0][key];
  for(i=1;i<arr.length;i++){
    if(arr[i][key]===pref){
      //merge 2 items, call the onMerge callback
      arr[i-1]=onMerge(arr[i-1],arr[i]);
      //remove the element
      arr.splice(i,1);
      // set i one back
      i--;
    }
    pref=arr[i][key];
  }
  return arr;
}
// functon that will be called when 2 items are merged
// stay will stay and gone will be gone
// this function is specific to your data type
function onMergeCallback(stay,gone){
  stay.val=stay.val+gone.val;
  return stay;
}

console.log(groupArray(arr,"date",onMergeCallback));