排序两个关联数组/堆栈

时间:2018-02-22 16:24:41

标签: javascript json sorting nested-loops

我正在实施我设计的算法,并正在探索不同的方法

这不是一个家庭作业问题,但我会解释一下:假设一个商人在不同的日子购买了苹果库存,并且在不同的日子也卖了一些。我想要他们当前购买的加权平均时间戳。

我将此数据对象存储为纪元时间中的时间戳字符串和苹果数量。我的数据集实际上是在单独的数据集中进行购买和销售,如下所示:

//buys
var incomingArray = {
  "1518744389": 10,
  "1318744389": 30
};

//sells
var outgoingArray = {
  "1518744480": 3,
  "1418744389": 5,
  "1408744389": 8
};

我希望结果只显示剩余的incomingArray时间戳购买对。

var incomingArrayRemaining = {
  "1518744389": 7,
  "1318744389": 17
};

如果您看到在后来的时间戳中有3个苹果的外向交易,因此从10​​减去。在购买10之前有13个外发交易,但在购买30之后,所以他们只减去30个

注意,如果在10之后转移10个以上,它将从10和30中减去。苹果的数量永远不会少于0。

首先,为了实现我的目标,似乎我需要知道他们购买的地段实际上还有多少人拥有。

而不是在LIFO方法中进行堆栈减法,似乎这更像是税收会计。批次本身必须独立处理。

因此,我必须在传出数组中获取销售的第一个索引的时间戳,并在传入的数组中找到最接近的买入时间戳

以下是我的尝试:

for (var ink in incomingArray) {
  var inInt = parseInt(ink);

  for (var outk in outgoingArray) {
    if (inInt >= 0) {
      var outInt = parseInt(outk);

      if (outInt >= inInt) {
        inInt = inInt - outInt;
        if (intInt < 0) {
          outInt = inInt * -1; //remainder
          inInt = 0;
        } //end if
      } //end if
    } //end if
  } //end innter for
} //end outer for

它是不完整的,并且嵌套for循环解决方案已经具有较差的计算时间。

该功能仅尝试对交易进行分类,以便仅剩余余额,通过从最近的进货余额中减去货币,并将该余额转入下一个进货余额

我觉得递归解决方案会更好,或者可能是我没有想过的更优雅的东西(嵌套的Object for each accessor in javascript)

在我对它们进行排序后,我需要实际采用加权平均法,我已经有了一些想法。

首先排序,然后是剩余数量的加权平均值。

无论如何,我知道StackOverflow上的javascript社区对于寻求帮助特别苛刻,但我陷入了僵局,因为我不仅需要一个解决方案,而且是一个计算上有效的解决方案,所以我可能会抛出一笔赏金在它上面。

1 个答案:

答案 0 :(得分:1)

您可以将对象转换为时间戳值对的数组。传出的可能是消极的。然后,您可以在时间戳之后轻松对它们进行排序,并累积您喜欢的方式:

 const purchases = Object.entries(incomingArray).concat(Object.entries(outgoingArray).map(([ts, val]) => ([ts, -val])));

 purchases.sort(([ts1, ts2]) => ts1 - ts2);

现在,您可以迭代时间跨度并在值增加时将增量存储在新数组中(新的进入):

 const result = [];
 let delta = 0, lastIngoing = purchases[0][0];

 for(const [time, value] of purchases){
   if(value > 0){
    // Store the old
    result.push([lastIngoing, delta]);
    // Set up new
   delta = 0;
   lastIngoing = time;
  } else {
   delta += value;
  }
}