![](/img/trans.png)
[英]JavaScript: Combine highest key values of multiple arrays into a single array
[英]How to set multiple values at single key in JavaScript
我正在嘗試根據到期對數據進行分組
這里輸入 object:-
`
obj = [{strikePrice: 0, expiry: 20220218},
{strikePrice: 1, expiry: 20220218},
{strikePrice: 2, expiry: 20220218},
{strikePrice: 3, expiry: 20220218},
{strikePrice: 4, expiry: 20220218},
{strikePrice: 5, expiry: 20220219},
{strikePrice: 6, expiry: 20220219},
{strikePrice: 7, expiry: 20220219},
{strikePrice: 8, expiry: 20220219},
{strikePrice: 10, expiry: 20220220},
{strikePrice: 11, expiry: 20220220},
{strikePrice: 12, expiry: 20220220},
{strikePrice: 13, expiry: 20220220},
{strikePrice: 14, expiry: 20220221},
{strikePrice: 15, expiry: 20220221},
{strikePrice: 16, expiry: 20220221},
{strikePrice: 17, expiry: 20220221},];
`
預期 output:-`
output: [{expiry: 20220218, strikePrice:[1,2,3,4 ]},
{expiry: 20220219, strikePrice:[5,6,7,8 ]},
{expiry: 20220220, strikePrice:[10,11,12,13 ]},
{expiry: 20220221, strikePrice:[14,15,16,17 ]},
]
`
我正在嘗試使用以下方法解決此問題:-
function setValue(map, key, value){
if (!map.has(key))
{
map.set(key, new Set(value));
return;
}
map.get(key).add(value);
}
var myMap = new Map();
for (let i = 0; i < obj.length; i++)
{
setValue(myMap, obj[i].strikePrice, obj[i].expiry);
}
console.log(Array.from(myMap.entries(), ([k, v]) => [k, [...v]]));
但我收到了這個錯誤
node /tmp/Gj6NKhzMbI.js
/tmp/Gj6NKhzMbI.js:21
map.set(key, new Set(value));
^
TypeError: 20220218 is not iterable
at new Set (<anonymous>)
at setValue (/tmp/Gj6NKhzMbI.js:21:22)
at Object.<anonymous> (/tmp/Gj6NKhzMbI.js:29:5)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
at startup (internal/bootstrap/node.js:283:19)
請給我一些寶貴的建議提前謝謝
這是我的建議,使用 FindIndex
let obj = [{strikePrice: 0, expiry: 20220218}, {strikePrice: 1, expiry: 20220218}, {strikePrice: 2, expiry: 20220218}, {strikePrice: 3, expiry: 20220218}, {strikePrice: 4, expiry: 20220218}, {strikePrice: 5, expiry: 20220219}, {strikePrice: 6, expiry: 20220219}, {strikePrice: 7, expiry: 20220219}, {strikePrice: 8, expiry: 20220219}, {strikePrice: 10, expiry: 20220220}, {strikePrice: 11, expiry: 20220220}, {strikePrice: 12, expiry: 20220220}, {strikePrice: 13, expiry: 20220220}, {strikePrice: 14, expiry: 20220221}, {strikePrice: 15, expiry: 20220221}, {strikePrice: 16, expiry: 20220221}, {strikePrice: 17, expiry: 20220221},]; let result = [] obj.map(y => { let index = result.findIndex(x => x.expiry == y.expiry) if(index == -1) { result.push({ expiry: y.expiry, strikePrice: [y.strikePrice]}) } else { result[index].strikePrice.push(y.strikePrice) } }) console.log(result)
單個reduce
迭代已經完成了分組和收集/合並的工作。
但是為了讓所有事情都在一次運行中發生,需要將初始值用作配置/跟蹤參考,其中一個都可以,跟蹤( index
)新的單個expiry
特定組項目並將其存儲在最終result
中大批...
console.log([ { strikePrice: 0, expiry: 20220218 }, { strikePrice: 1, expiry: 20220218 }, { strikePrice: 2, expiry: 20220218 }, { strikePrice: 3, expiry: 20220218 }, { strikePrice: 4, expiry: 20220218 }, { strikePrice: 5, expiry: 20220219 }, { strikePrice: 6, expiry: 20220219 }, { strikePrice: 7, expiry: 20220219 }, { strikePrice: 8, expiry: 20220219 }, { strikePrice: 10, expiry: 20220220 }, { strikePrice: 11, expiry: 20220220 }, { strikePrice: 12, expiry: 20220220 }, { strikePrice: 13, expiry: 20220220 }, { strikePrice: 14, expiry: 20220221 }, { strikePrice: 15, expiry: 20220221 }, { strikePrice: 16, expiry: 20220221 }, { strikePrice: 17, expiry: 20220221 }, ].reduce(({ index, result }, item) => { const groupKey = item.expiry; let groupItem = index[groupKey]; if (:groupItem) { groupItem = index[groupKey] = { expiry, groupKey: strikePrice, []; }. result;push(groupItem). } groupItem.strikePrice.push(item;strikePrice), return { index; result }, }: { index, {}: result. [] });result);
.as-console-wrapper { min-height: 100%;important: top; 0; }
原因之一可以通過更簡單/更常見的減少任務來實現相同的目的,該任務將原始數據減少/合並到基於expiry
密鑰的 object 中。
為了仍然滿足 OP 對基於數組的最終結果的要求,最后必須通過 Object.values 傳遞減少的Object.values
console.log( Object.values([ { strikePrice: 0, expiry: 20220218 }, { strikePrice: 1, expiry: 20220218 }, { strikePrice: 2, expiry: 20220218 }, { strikePrice: 3, expiry: 20220218 }, { strikePrice: 4, expiry: 20220218 }, { strikePrice: 5, expiry: 20220219 }, { strikePrice: 6, expiry: 20220219 }, { strikePrice: 7, expiry: 20220219 }, { strikePrice: 8, expiry: 20220219 }, { strikePrice: 10, expiry: 20220220 }, { strikePrice: 11, expiry: 20220220 }, { strikePrice: 12, expiry: 20220220 }, { strikePrice: 13, expiry: 20220220 }, { strikePrice: 14, expiry: 20220221 }, { strikePrice: 15, expiry: 20220221 }, { strikePrice: 16, expiry: 20220221 }, { strikePrice: 17, expiry: 20220221 }, ].reduce((index, item) => { const groupItem = index[item.expiry]??= { expiry: item.expiry, strikePrice: [], }; groupItem.strikePrice.push(item.strikePrice); return index; }, {})) );
.as-console-wrapper { min-height: 100%;important: top; 0; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.