簡體   English   中英

如何使用javascript循環鍵,值並在另一個匹配時添加一個鍵的值

[英]How to use javascript to loop through key , values and add up one key's value when the other's match

我有一個記錄數據集,如下所示:

[{
 "d1d":"2015-05-28T00:00:00.000Z",
 "d1h":0,
 "d15m":0,
 "ct":3
},
{
 "d1d":"2015-05-28T00:00:00.000Z",
 "d1h":0,
 "d15m":0,
 "ct":1
}
]

每個記錄中的ct值都會發生變化。 如果d1d,d1h和d15m在一個或多個記錄中相同,我需要將這些記錄合並為一個具有所有ct值之和的記錄。

我有jquery,我可以使用grep嗎?

我意識到服務器端可以更好地獲取這些數據,但我無法控制它。

你不必為此使用jQuery,vanilla JavaScript也可以。 我會告訴你兩個問題的解決方案;

示例1:濫用Array#reduce作為迭代器

var intermediaryArray = [];
dataset.reduce(function(prev, curr) {
  if(prev.d1d === curr.d1d && prev.d1h === curr.d1h && prev.d15m === curr.d15m) {
    intermediaryArray.push({
      d1d: prev.d1d,
      d1h: prev.d1h,
      d15m: prev.d15m,
      ct: prev.ct + curr.ct
    });
  } else {
    // push the one that wasn't the same
    intermediaryArray.push(curr);
  }
  // return current element so reduce has something to work on
  // for the next iteration.
  return curr;
});

示例2:使用Array#Map和Array#Reduce結合使用

此示例使用underscore.js來演示您想要執行的操作背后的邏輯。

.map()生成新的分組對象數組。 .groupBy()生成一個子數組數組,其中包含傳遞謂詞的對象,所有對象必須共享相同的d1d或分組函數。 .reduce()所有子數組.reduce()為一個值,將兩個ct的對象相互添加。

var merged = _.map(_.groupBy(a, 'd1d'), function(subGroup) {
  return subGroup.reduce(function(prev, curr) {
    return {
      d1d: prev.d1d,
      d1h: prev.d1h,
      d15m: prev.d15m,
      ct: prev.ct + curr.ct
    };
  });
});

這是一個可能的解決方案:

var dataset = [{
 "d1d":"2015-05-28T00:00:00.000Z",
 "d1h":0,
 "d15m":0,
 "ct":3
},
{
 "d1d":"2015-05-28T00:00:00.000Z",
 "d1h":0,
 "d15m":0,
 "ct":1
}
]

function addCt(dataset) {
  var ctMap = {}
  var d1d, d1h, d15m, ct, key, value
  for (var ii=0, record; record=dataset[ii]; ii++) {
    key = record.d1d+"|"+record.d1h+"|"+record.d15m
    value = ctMap[key]
    if (!value) {
      value = 0
    }
    value += record.ct
    ctMap[key] = value
  }

  return ctMap
}

ctMap = addCt(dataset)
console.log(ctMap)
// { "2015-05-28T00:00:00.000Z|0|0": 4 }

您可能希望以不同的方式構造密鑰。 您可能希望將值設置為包含d1d,d1h,d15m和累積ct值的對象,並為所有匹配的d1d,d1h和d15m值設置單個對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM