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。我的意思是item, item.product, item.product.images, item.product.images[0],等等可能是nulls。

我正在寻找类似“合并”的东西:

  1. 将知道如何处理nulls 并且不会为item.productif itemis抛出异常null
  2. 如果存在null.

有这样的吗?

4

6 回答 6

4

您可以使用 boolean&&并依靠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]不为空):

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

如果你想要 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

不确定是否有类似的东西,但我认为您可以创建和使用如下自定义函数:

    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

您可以使用逻辑或运算符“||” 合并,如此处所述...

http://pietschsoft.com/post/2008/10/14/JavaScript-Gem-Null-Coalescing-using-the-OR-Operator

var something = 也许没有 || 0;

适用于 null 或 undefined。

于 2013-08-27T12:33:12.843 回答
0

如果您不确定对象实际上是什么。你可以做旧的尝试捕捉......

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

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

这不会破坏您的应用程序,因为错误未throw编辑。你可以在 catch 语句中做的是用缺少的默认值填充你的对象。

于 2015-12-15T10:48:20.487 回答