0

定期的に空のノードを削除することで、javascript 配列のサイズを縮小したいと考えています (ほとんどの場合、偶数ノードまたは奇数ノードごと)。組み込みのjavascriptまたはd3.jsメソッドを使用してこれを行う簡単で効率的な方法はありますか?

バックグラウンド

データ駆動型のブラウザー内アプリケーションの場合、水平時間スケールで単位を表すインデックス付きの配列があります。

初期のタイムスケール間隔はアルゴリズムの最良の推測ですが、多くの場合、すべてのインデックス ポイントにデータが関連付けられているわけではありません。実際、見つかった最小時間間隔に基づいて、データに影響を与えずに完全に削除できる未使用の要素の規則的なパターンを特定できることがよくあります。

タイムスケールを実際のデータにマッピングすることは、d3 セレクションを使用して十分に簡単ですが (空の要素は無視されます)、これらの配列のサイズと、それらが少しずつ渡されるという事実を考えると、早期の削除は理にかなっているようです。データ存在する場合、そのデータは非常に大きい (ツリー) ため、新しい配列を作成するよりも、その場で削除する方がおそらく最適です。

配列のドキュメント (ネイティブおよび d3.js) から、考えられるアプローチがいくつか見られますが、互換性の問題と考えられる副作用の両方に少し注意を払っています。驚くかもしれませんが、配列インデックスのパターン マッチングに関連する例も見つかりませんでした。

総括する:

  1. 削除するノードはパターンに従います (2 ノードごとなど)
  2. これらのノードは空であることが保証されています。
  3. それ以上の依存関係 (jQuery など) はありません。

どうもありがとう

4

1 に答える 1

0

「手動」で行うか、フィルター機能を使用できます。

フィルター関数はより高速です...書くには:

function isEmptyNode(x, i ) { return ( i & 1 ) } ;   // to keep odd nodes

var myNewArray = myOldArray.filter(isEmptyNode) ; 

...しかし、古き良き for ループ (インプレース) は、はるかに高速です。

var dst=0;
for (var i=0, len=myArray.length; i<len ; i++ ) { if (i & 1) myArray[dst++]=myArray[i] }
myArray.length = dst;

if (i & 1)を a で簡単に変更 if (myTestFunction(i))して、より一般的なフィルタリングを行うことができます。

パフォーマンスについては、for ループで 100 倍以上高速であることをここで確認できます: http://jsperf.com/filter-odd-items-in-array/2

于 2013-06-11T10:13:54.280 に答える