2017-10-09 59 views
-2

刪除某些值我有一個數組看起來像這樣:最快的方式排列

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條目,所以我想知道什麼是最快的方法來實現這個?有人可以提供工作片段嗎?

謝謝!

+1

「最快」將取決於具體情況。做一些變化並運行基準。 – glennsl

+0

您是否檢查過任何簡單的過濾方法是否緩慢? – Yoshi

+0

@Yoshi,是的,但我不知道如何應用它。 –

回答

2

如果你想快速的代碼,只是檢查了不同的值。

的或(||)將短路,因此從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的答案借來的時間碼)

(對於我來說)這將運行快兩倍的slice/every組合耀西用,但一半爲可讀/維護。

這取決於你是否喜歡可讀的代碼,或者如果你想拋出所有的指導方針去原始速度

2

以下需要我的年齡舊機器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);