我有這些物件,它們可以在陣列中,例如在示例或資料庫中:
[
{ "payer": "DANNON", "points": 1000, "timestamp": "2020-11-02T14:00:00Z" }
{ "payer": "UNILEVER", "points": 200, "timestamp": "2020-10-31T11:00:00Z" }
{ "payer": "DANNON", "points": -200, "timestamp": "2020-10-31T15:00:00Z" }
{ "payer": "MILLER COORS", "points": 10000, "timestamp": "2020-11-01T14:00:00Z" }
{ "payer": "DANNON", "points": 300, "timestamp": "2020-10-31T10:00:00Z" }
]
{ "points": 5000 }我想從基于時間戳的最舊點開始從這些物件的點值中減去總計作為示例,請記住沒有付款人的點數會變為負數。然后我想回傳每個付款人的積分使用了多少。預期結果如下所示:
[
{ "payer": "DANNON", "points": -100 },
{ "payer": "UNILEVER", "points": -200 },
{ "payer": "MILLER COORS", "points": -4,700 }
]
我最初的解決方案是:
- 根據最早的時間戳對陣列進行排序
- 創建一個新物件來存盤每個付款人使用的積分數
- 遍歷排序的陣列并從每個付款人中減去點數并存盤在該新物件中使用的點數。
- 將所有新物件推送到一個陣列并回傳它。這個解決方案對我來說很有意義,但我無法實作它,我一直有意想不到的結果,直到我的大腦凍結,我無法再思考了。
這是一個學徒面試問題。一開始我認為這很容易,但是在花了幾個小時沒有解決它之后,我在想我是一個冒名頂替者嗎?還是這個問題很棘手?
感謝您分享您的知識和經驗并幫助我。我很感激!
uj5u.com熱心網友回復:
我剛剛實作了您在問題中列出的那些步驟并制作了一個功能subtract(payers, subtractingPoints):
給定一個付款人陣列和要減去的點數,它將按時間戳對陣列進行排序,并將從每個付款人那里拿走這些點,直到達到該數字或在所有點都可以減去之前達到陣列長度。
該函式回傳一個物件陣列,每個物件說明每個付款人(分組)獲得了多少積分。
let payers = [
{
"payer": "DANNON",
"points": 1000,
"timestamp": "2020-11-02T14:00:00Z"
},
{
"payer": "UNILEVER",
"points": 200,
"timestamp": "2020-10-31T11:00:00Z"
},
{
"payer": "DANNON",
"points": -200,
"timestamp": "2020-10-31T15:00:00Z"
},
{
"payer": "MILLER COORS",
"points": 10000,
"timestamp": "2020-11-01T14:00:00Z"
},
{
"payer": "DANNON",
"points": 300,
"timestamp": "2020-10-31T10:00:00Z"
}
];
const o = subtract(payers, 5000);
console.log(o);
function subtract(payers, subtractingPoints){
payers.sort(function(x, y){
date1 = new Date(x.timestamp);
date2 = new Date(y.timestamp);
return date1 - date2 ;
});
payersAccounted = {};
let i = 0;
while(subtractingPoints > 0 && i < payers.length){
const currentPayer = payers[i].payer;
let pointsTookAway =
Math.min(payers[i].points, subtractingPoints);
if( !(currentPayer in payersAccounted) )
payersAccounted[currentPayer] = pointsTookAway;
else
payersAccounted[currentPayer] = pointsTookAway;
subtractingPoints -= pointsTookAway;
i ;
}
let result = [];
for (const [key, value] of Object.entries(payersAccounted)) {
result.push( { "payer": key, "points": -1*value } );
}
return result;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471193.html
標籤:javascript 数组 算法 数据结构 javascript 对象
