首页 > 解决方案 > Powershell:滞后函数优于属性

问题描述

大家好,

我正在寻找是否有可能实现滞后功能 - 无需遍历整个列表,例如,查看以下示例:

$input = '[
    { "user_id":"1", "earned":"100", "valid_at": "20200101"},
    { "user_id":"1", "earned":"200", "valid_at": "20200102"},
    { "user_id":"1", "earned":"10", "valid_at": "20200103"},
    { "user_id":"2", "earned":"10", "valid_at": "20200101"},
    { "user_id":"2", "earned":"40", "valid_at": "20200103"},
    { "user_id":"3", "earned":"400", "valid_at": "20200101"},
    { "user_id":"3", "earned": null, "valid_at": "20200102"},
    { "user_id":"3", "earned": "20", "valid_at": "20200103"}
]'

$expected_output = '[
    { "user_id":"1", "earned":"100", "valid_at": "20200101", "last_earned":null},
    { "user_id":"1", "earned":"200", "valid_at": "20200102", "last_earned":"100"},
    { "user_id":"1", "earned":"10", "valid_at": "20200103", "last_earned":"200"},
    { "user_id":"2", "earned":"10", "valid_at": "20200101", "last_earned":null},
    { "user_id":"2", "earned":"40", "valid_at": "20200103", "last_earned":"10"},
    { "user_id":"3", "earned":"400", "valid_at": "20200101", "last_earned":null},
    { "user_id":"3", "earned": null, "valid_at": "20200102", "last_earned":"400"},
    { "user_id":"3", "earned": "20", "valid_at": "20200103", "last_earned":null}
]'

$json_input = ConvertFrom-Json –InputObject $input

$expected_json_output = ConvertFrom-Json –InputObject $expected_output

这将创建以下输入:

在此处输入图像描述

连同以下预期输出:

在此处输入图像描述

现在我的问题是:

标签: powershell

解决方案


假设输入已经排序,您可以通过使用哈希表跟踪每个用户 id 的最后一次看到的值来一次性完成此操作:

$last = @{}
$json_input |Select-Object *,@{Name='earned_day_before';Expression={$last[$_.user_id];$last[$_.user_id]=$_.earned}}

如果没有,您可以先按用户 ID 对所有记录进行排序,然后按日期排序:

$last = @{}
$json_input |Sort-Object user_id,valid_at |Select-Object *,@{Name='earned_day_before';Expression={$last[$_.user_id];$last[$_.user_id]=$_.earned}}

推荐阅读