2012-11-06 29 views
0

我正在使用jQuery,Backbone(和underscore)和RequireJSjavascript合併

我有這樣的代碼:

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。通過我所說的一切,item, item.product, item.product.images, item.product.images[0]等等可能是null s。

我正在尋找類似「合併」中指出:

  1. 將知道如何處理null S和爲item.product如果itemnull不會拋出異常。
  2. 將允許我提供默認值,如果有null

有沒有這樣的事情?

+0

最好在模型中提供默認值... –

回答

4

您可以使用布爾&&,依靠short-circuiting

... 
'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; 
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 
    }); 
}); 
0

如果你想爲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"); 
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); 
    } 
0

如果您不確定對象實際是什麼。你可以做好舊的嘗試......

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

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

這不會破壞你的應用程序,因爲其誤差不throw版。在catch語句中你可以做的是用你缺省的缺省值填充你的對象。