0

プロパティに配列が取り込まれている場合と取り込まれていない場合があるオブジェクトの配列があります。null x に対して $.each(x,function(){}) を呼び出すと、型エラーが発生する

try{
  var a = {};
  $.each(a.doesnotexist,function(k,v){})
} catch(e) {
  console.log(e.message)
}

空のオブジェクトで $.extend を使用し、その値を $.each() に渡すという提案を見てきました。これらはどちらも私にとってはうまくいくようで、よりシンプルに見えますが、どちらにも欠点はありますか?

//some test values, not guaranteed properties are populated
var a = [
  {v: [1,2,3,4,5], w: [1,2,3,4,5,6]},
  {v: [1,2,3,4,5]},
  {w: [1,2,3,4,5]},
  {v: [1,2,3], w: []},
  {v: null}
];

for (i =0; i < a.length; i++) {if (a[i].v) $.each(a[i].v,function(k,v){});}
for (i =0; i < a.length; i++) {$.each(a[i].v||[],function(k,v){});}

2番目は私には最もきれいに思えます。

4

5 に答える 5

1

in演算子を使用して、オブジェクトにプロパティが存在するかどうかを確認できます。

for (var i = 0; i < a.length; ++i) {
  if ("v" in a[i]){ 
    $.each(a[i].v, function(k,v) {
      ...
    });
  }
}

また、instanceof演算子を使用して、正しい変数タイプと照合します。

if ("v" in a[i] && a[i].v instanceof Array) { ... } 

短絡評価とは対照的に、これは真の値の影響を受けません。

$.each(a[i].v || [], ...);
于 2012-10-03T19:38:47.623 に答える
0

これは、あなたがやりたいことのより読みやすいバージョンです(明確で詳細なチェックを使用します)

for(var i in a)
{
    if(typeof a[i] == 'object' && typeof a[i].v != 'undefined')
    {
        $.each(a[i].v,function(k,v){  });
    }
}

a[i].vあなたが本当に良くなりたいのであれば、あなたはまた、良い測定のために長さをチェックすることができます!

于 2012-10-03T19:37:30.473 に答える
0

最初のものをショートカットすることもできます

a[i].v && $.each(a[i].v, function(k,v){});

$.eachプレーンオブジェクトにいくらかのオーバーヘッドをかけます。

私のアドバイスは、次のようなnullセーフforループラッパーを作成することです。

function nullsafeForEach(arr, fun) {
  var i, len;
  if (!arr || !arr.length || !fun) {
    return;
  }
  for (i = 0, len = arr.length; i < len; ++i) {
    fun(arr[i]);
  };
}

そして、キャッシュすることを検討してくださいa.length

于 2012-10-03T19:30:12.993 に答える
0

あなたはおそらくundefined、ではなく、を意味しnullます。JavaScriptでは、まだ値を持たない変数はに設定されundefinedます。

個人的には、ソリューション#2が一番好きです。それは私がすることです。ただし、これが他の誰かが将来維持する可能性のあるコードである場合は、方法1を使用しても問題がないことを覚えておく必要があります。方法#1は、それが何をしているのかがより明白であり、したがって、論理演算子の短絡の概念に精通していない可能性のある人(例||)によってより保守しやすくなります。

また、メソッド#2は、メソッド#1よりも少し遅くなります。これは、が偽の場合は空の配列をインスタンス化する必要があるためa[i].vです。ただし、オーバーヘッドはごくわずかであるため、何らかの理由でこれがパフォーマンスクリティカルまたはメモリクリティカルなコードでない限り、方法2で問題ありません。

于 2012-10-03T19:33:52.323 に答える
0

別の可能性は、最初の配列をフィルタリングすることです。

function hasV(item) { return !!item.v; }
function doWork(k, v) { /* do your work */ }

$.each($.grep(a, hasV), doWork);

または、ネイティブ メソッドを使用して同じことを行います。

function hasV(item) { return !!item.v; }
function doWork(v, k) { /* do your work */ }

a.filter(hasV).forEach(doWork);
于 2012-10-03T19:34:32.213 に答える