0

jQueryBackbone (およびアンダースコア) およびRequireJSを使用しています。

私はこのコードを持っています:

var products = _.map(items, function(item) {
    return new ProductModel({
        title: item.product.title,
        description: item.product.description,
        link: item.product.link,
        'image-src': item.product.images[0].link,
        'image-height': item.product.images[0].height,
        'image-width': item.product.images[0].width
    });
});

残念ながら、すべてがnull. 私が意味するすべてのことなどはsitem, item.product, item.product.images, item.product.images[0]かもしれませんnull

「合体」のようなものを探しています:

  1. s の処理方法を認識し、 if isnullの例外をスローしません。item.productitemnull
  2. があった場合、デフォルト値を指定できますnull

そのようなものはありますか?

4

6 に答える 6

4

ブール値を使用して、短絡&&に依存できます。

...
'image_src': item && item.product && item.product.images && item.product.images[0] && item.product.images[0].link,
'image_height': item && item.product && item.product.images && item.product.images[0] && item.product.images[0].height,
...

多くの場合、非常に多くの行にわたって同じテストを実行したくありません。さまざまな属性を適切なデフォルトに設定して戻り値を保存し、item.product.images[0]null でない場合は条件付きで実際の値を追加します。

var returnObject = { /* default values here */ }, product, image;

if (product = item && item.product) {
    returnObject.title = product.title,
    returnObject.description = product.description,
    returnObject.link = product.link
};

if (image = product && product.images && product.images[0]) {
    returnObject['image-src'] = image.link;
    returnObject['image-height'] = image.height;
    returnObject['image-width'] = image.width;
}

return returnObject;
于 2012-11-06T17:50:35.093 に答える
3

最初.filterに空の製品を取り出します。

var goodItems = _.filter(items, function(item) {
     return 'product' in item;
});

productのオブジェクトが存在しない場合は空のオブジェクトを指定して、イメージ テストを簡素化します。

var products = _.map(goodItems, function(item) {
    var product = item.product;
    var img = (product.images && product.images[0]) || {};
    return new ProductModel({
        title: product.title,
        description: product.description,
        link: product.link,
        'image-src': img.link,
        'image-height': img.height,
        'image-width': img.width
    });
});
于 2012-11-06T18:02:52.617 に答える
0

そのようなものがあるかどうかはわかりませんが、以下のようにカスタム関数を作成して使用できると思います。

    return new ProductModel({
             title: getPorductAttribute(item,'title'),
             description: getPorductAttribute(item,'description'),
             link: getPorductAttribute(item, 'link'),
             'image-src': getImageAttirbute(item,0,'link'),
             'image-height': getImageAttirbute(item,0,'height'),
             'image-width': getImageAttirbute(item,0,'width')
            });


  function getPorductAttribute(item, attributeName){
       if(!(item && item.product)) 
           return defaultValue;
       return item.product.getAttribute(attributeName);
   }

  function getImageAttirbute(item, index, attributeName){
       if(!(item && item.product && item.product.images)) 
           return defaultValue;
       return item.product.images[index].getAttribute(attributeName);
   }
于 2012-11-06T18:13:48.820 に答える
0

s のデフォルト値が必要な場合はnull、次のようなヘルパー関数を作成できます。

var coalesce = function(obj, path, defaultValue) {
  while(obj != null && path.length) {
    obj = obj[path.shift()];
  }
  return (obj == null ? defaultValue : obj);
};

次のように使用します。

coalesce(item, ["product", "title"], "Default title");
coalesce(item, ["product", "images", 0, "link"], "Default image link");
于 2012-11-06T18:08:49.687 に答える
0

オブジェクトが実際に何であるかわからない場合。古き良きtry-catchを実行できます...

var testObject = {
  alpha: {
    beta: null
  },
  gama: {
    delta: null
  }  
};

try {
    console.log(testObject.alpha.beta.gama.delta);
} catch(err) {    
    alert(err.message);
}

throwエラーはedではないため、アプリが壊れることはありません。catch ステートメント内でできることは、欠落しているデフォルトでオブジェクトを埋めることです。

于 2015-12-15T10:48:20.487 に答える