[解決済み] node.jsでオブジェクトのキーに繰り返しアクセスする
2022-05-31 12:11:37
質問
Javascript 1.7以降では イテレータ オブジェクトがあり、これを利用することができます。
var a={a:1,b:2,c:3};
var it=Iterator(a);
function iterate(){
try {
console.log(it.next());
setTimeout(iterate,1000);
}catch (err if err instanceof StopIteration) {
console.log("End of record.\n");
} catch (err) {
console.log("Unknown error: " + err.description + "\n");
}
}
iterate();
は、node.jsにこのようなものがあるのでしょうか?
今、使っているのは
function Iterator(o){
/*var k=[];
for(var i in o){
k.push(i);
}*/
var k=Object.keys(o);
return {
next:function(){
return k.shift();
}
};
}
にオブジェクトのキーを格納することで、多くのオーバーヘッドを生み出します。
k
.
どのように解決するのですか?
オブジェクトや配列に対する遅延反復処理を行いたい。これはES5では不可能です(したがって、node.jsでは不可能です)。いずれはこれを実現する予定です。
唯一の解決策は、V8を拡張してイテレータ(とおそらくジェネレータ)を実装するnodeモジュールを見つけることです。私はどんな実装も見つけることができませんでした。spidermonkey のソースコードを見て、V8 拡張として C++ で書いてみるとよいでしょう。
次のようにすることもできますが、これはすべてのキーをメモリにロードすることになります。
Object.keys(o).forEach(function(key) {
var val = o[key];
logic();
});
しかし
Object.keys
はネイティブメソッドであるため、より良い最適化ができるかもしれません。
ご覧の通り、Object.keysは大幅に高速化されています。実際のメモリストレージがより最適化されているかどうかは別問題です。
var async = {};
async.forEach = function(o, cb) {
var counter = 0,
keys = Object.keys(o),
len = keys.length;
var next = function() {
if (counter < len) cb(o[keys[counter++]], next);
};
next();
};
async.forEach(obj, function(val, next) {
// do things
setTimeout(next, 100);
});
関連
-
[解決済み] Error : 未定義のプロパティ 'map' を読み取ることができません。
-
[解決済み] Web API エラー - このリクエストはブロックされました; コンテンツは HTTPS で提供されなければなりません
-
JavaScriptのgetElementById、getElementsByTagNam、getElementsByClassNameの違いと使い方
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] JavaScriptのオブジェクトが空であることをテストするにはどうすればよいですか?
-
[解決済み] JavaScriptのオブジェクトにキーが存在するかどうかをチェックする?
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsでファイルを書き込む
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JavaScriptのクロージャの説明
-
Vueにシンプルなメモ帳機能を実装
-
vue+webrtc(Tencent cloud)ライブ機能の実践を実現するために
-
Vueのクラススタイルの使い方の詳細
-
[解決済み】GETできない / Nodejsエラー
-
[解決済み】React - TypeError: 未定義のプロパティ 'props' を読み取ることができない。
-
[解決済み】React-Redux: アクションはプレーンオブジェクトでなければならない。非同期アクションにはカスタムミドルウェアを使用する
-
[解決済み】 env: node: macにそのようなファイルやディレクトリはありません
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
JSクリックイベント - Uncaught TypeError: プロパティ 'onclick' に null を設定できません。