排序两个关联 arrays/stacks
sorting two associative arrays/stacks
我正在实施我设计的算法并正在探索不同的方法
这不是作业问题,但我会像作业一样解释它:假设商家在不同日期购买了苹果库存,并在不同日期销售了一些。我想要他们当前购买的加权平均时间戳。
我将此数据对象存储为纪元时间的时间戳字符串和苹果数量。我的数据集实际上在不同的数据集中有购买和销售,如下所示:
//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 循环解决方案的计算时间已经很差了。
该函数仅尝试对交易进行排序,以便仅保留剩余余额,方法是从最近的收款余额中减去一笔付款,并将余数计入下一个收款余额
我觉得递归解决方案会更好,或者可能是我没想到的更优雅的解决方案(javascript 中的嵌套对象 forEach 访问器)
在我对它们进行排序之后,我需要实际执行加权平均法,我已经有了一些想法。
先排序,再对剩余数量进行加权平均。
无论如何,我知道 Whosebug 上的 javascript 社区对寻求帮助特别苛刻,但我陷入了僵局,因为我不仅需要一个解决方案,而且需要一个计算效率高的解决方案,所以我会可能会给它悬赏。
您可以将对象转换为 timestamp-value 对数组。传出的可能是负面的。然后你可以很容易地在时间戳之后对它们进行排序并累积你喜欢的方式:
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;
}
}
我正在实施我设计的算法并正在探索不同的方法
这不是作业问题,但我会像作业一样解释它:假设商家在不同日期购买了苹果库存,并在不同日期销售了一些。我想要他们当前购买的加权平均时间戳。
我将此数据对象存储为纪元时间的时间戳字符串和苹果数量。我的数据集实际上在不同的数据集中有购买和销售,如下所示:
//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 循环解决方案的计算时间已经很差了。
该函数仅尝试对交易进行排序,以便仅保留剩余余额,方法是从最近的收款余额中减去一笔付款,并将余数计入下一个收款余额
我觉得递归解决方案会更好,或者可能是我没想到的更优雅的解决方案(javascript 中的嵌套对象 forEach 访问器)
在我对它们进行排序之后,我需要实际执行加权平均法,我已经有了一些想法。
先排序,再对剩余数量进行加权平均。
无论如何,我知道 Whosebug 上的 javascript 社区对寻求帮助特别苛刻,但我陷入了僵局,因为我不仅需要一个解决方案,而且需要一个计算效率高的解决方案,所以我会可能会给它悬赏。
您可以将对象转换为 timestamp-value 对数组。传出的可能是负面的。然后你可以很容易地在时间戳之后对它们进行排序并累积你喜欢的方式:
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;
}
}