簡體   English   中英

從數組中刪除某些值的最快方法

[英]Fastest way remove certain values from array

我有一個看起來像這樣的數組:

const data =  [
    ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '04b073133c7843248a7a3dbc968f75a0', 'network1', 'affiliate',
        1141338.0, 18164.0, 0.08, 0.07, 0.62, 0.06, 0.0138, 0.0738, 0.465, 0.10695, 0.57195, 0.0525, 0.012075, 0.064575],
    ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '4420cc109ec54214b68edc906b18e44a', 'network1', 'affiliate',
        1141338.0, 18164.0, 0.75, 0.67, 5.58, 0.5625, 0.129375, 0.691875, 4.185, 0.96255, 5.14755, 0.5025, 0.115575, 0.618075],
    ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '90a7cbf1cf4e4043889626c4119d4b4d', 'network1', 'affiliate',
        1141338.0, 18164.0, 0.08, 0.07, 0.62, 0.06, 0.0138, 0.0738, 0.465, 0.10695, 0.57195, 0.0525, 0.012075, 0.064575],
    ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '0f04f1ff385541d3a8d9ea2f0d85482b', 'network1', 'affiliate',
        1141338.0, 18164.0, 0.08, 0.07, 0.62, 0.06, 0.0138, 0.0738, 0.465, 0.10695, 0.57195, 0.0525, 0.012075, 0.064575],
    ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '0f04f1ff385541d3a8d9ea2f0d85482b', 'network1', 'affiliate',
        1232113, 1232133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
];

我想要實現(但不知道如何)是刪除所有看起來像這個數組中最后一個條目的條目(以最快的方式),例如[Wed Sep 20 09:00:00 GMT+02:00 2017, SKYSCANNER, 0f04f1ff385541d3a8d9ea2f0d85482b, network1, affiliate, 1232113, 1232133, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

基本上,如果第 8 個位置之后的所有值都為零,則不需要該條目並且必須刪除該條目。

通常在我的情況下,這樣的數組可以有 5-15k 個條目,所以我想知道實現這一目標的最快方法是什么? 有人可以提供一個工作片段嗎?

謝謝!

以下在我的舊機器上需要 11 毫秒。 正如 Cerbrus 所寫,只需使用過濾器,15k 並不多:

 const data = [ ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '04b073133c7843248a7a3dbc968f75a0', 'network1', 'affiliate', 1141338.0, 18164.0, 0.08, 0.07, 0.62, 0.06, 0.0138, 0.0738, 0.465, 0.10695, 0.57195, 0.0525, 0.012075, 0.064575], ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '4420cc109ec54214b68edc906b18e44a', 'network1', 'affiliate', 1141338.0, 18164.0, 0.75, 0.67, 5.58, 0.5625, 0.129375, 0.691875, 4.185, 0.96255, 5.14755, 0.5025, 0.115575, 0.618075], ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '90a7cbf1cf4e4043889626c4119d4b4d', 'network1', 'affiliate', 1141338.0, 18164.0, 0.08, 0.07, 0.62, 0.06, 0.0138, 0.0738, 0.465, 0.10695, 0.57195, 0.0525, 0.012075, 0.064575], ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '0f04f1ff385541d3a8d9ea2f0d85482b', 'network1', 'affiliate', 1141338.0, 18164.0, 0.08, 0.07, 0.62, 0.06, 0.0138, 0.0738, 0.465, 0.10695, 0.57195, 0.0525, 0.012075, 0.064575], ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '0f04f1ff385541d3a8d9ea2f0d85482b', 'network1', 'affiliate', 1232113, 1232133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ]; let test = []; for (let i = 0; i < 3000; i += 1) { test = test.concat(data); } const start = performance.now(); const result = test.filter( // reject entry, if not // every value from 8th to last // is 0 (entry) => !entry.slice(8).every((val) => 0 === val) ); console.log(performance.now() - start);

如果您想要快速代碼,只需檢查單獨的值。

or ( || ) 將短路,因此e[7] - e[18]中具有值的第一個條目將使該行通過測試,這意味着filter將移至下一行。

 const data = [ ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '04b073133c7843248a7a3dbc968f75a0', 'network1', 'affiliate', 1141338.0, 18164.0, 0.08, 0.07, 0.62, 0.06, 0.0138, 0.0738, 0.465, 0.10695, 0.57195, 0.0525, 0.012075, 0.064575], ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '4420cc109ec54214b68edc906b18e44a', 'network1', 'affiliate', 1141338.0, 18164.0, 0.75, 0.67, 5.58, 0.5625, 0.129375, 0.691875, 4.185, 0.96255, 5.14755, 0.5025, 0.115575, 0.618075], ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '90a7cbf1cf4e4043889626c4119d4b4d', 'network1', 'affiliate', 1141338.0, 18164.0, 0.08, 0.07, 0.62, 0.06, 0.0138, 0.0738, 0.465, 0.10695, 0.57195, 0.0525, 0.012075, 0.064575], ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '0f04f1ff385541d3a8d9ea2f0d85482b', 'network1', 'affiliate', 1141338.0, 18164.0, 0.08, 0.07, 0.62, 0.06, 0.0138, 0.0738, 0.465, 0.10695, 0.57195, 0.0525, 0.012075, 0.064575], ['Wed Sep 20 09:00:00 GMT+02:00 2017', 'SKYSCANNER', '0f04f1ff385541d3a8d9ea2f0d85482b', 'network1', 'affiliate', 1232113, 1232133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ]; let test = []; for (let i = 0; i < 3000; i += 1) { test = test.concat(data); } const start = performance.now(); const result = test.filter(e => e[7]||e[8]||e[9]||e[10]||e[11]||e[12]||e[13]||e[14]||e[15]||e[16]||e[17]||e[18]); console.log(performance.now() - start);

(從 Yoshi 的回答中借用的時間代碼)

(對我來說,)它的運行速度是 Yoshi 使用的slice / every組合的兩倍,但可讀性/可維護性只有一半。

您是否更喜歡可讀的代碼,或者您是否想將所有指南都拋到窗外以追求原始速度,這取決於您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM