Javascript:当属性可能不存在时,在对象中使用OR条件

时间:2016-04-03 02:38:42

标签: javascript performance

我试图找到一种优雅的Javascript方式来执行以下操作:

var c;
if(obj[i].cost){
  c = obj[i].cost.toFixed(2);
}else{
  c = null
}

arr.push(c);

在实践中,我有5到10个这些元素,我试图找到一种更有效的编码方式。像这样:

arr.push(obj[i].cost.toFixed(2) || null)

会很可爱,但是当没有cost属性时会中断。

是否有一种最小代码方式可以在不为每个属性执行详细if/else语句的情况下执行此操作?

5 个答案:

答案 0 :(得分:3)

我建议使用Conditional (ternary) Operator,如下所示:

arr.push(obj[i].cost ? obj[i].cost.toFixed(2) : null)

有关Conditional (ternary) Operator的详细信息,请查看此link

答案 1 :(得分:2)

这个怎么样?

var nullCost = {
    toFixed: function() { return null; }
};

var c = (obj[i].cost || nullCost).toFixed(2);

答案 2 :(得分:1)

鉴于您的代码在索引器中使用i,它似乎可能在循环体中使用。

var c;
if(obj[i].cost){
//    ^^^
  c = obj[i].cost.toFixed(2);
//       ^^^
}else{
  c = null
}
arr.push(c);

我将做出一个巨大的假设,所以请更正它,因为它很有可能是错的。我将假设用法看起来像是:

var arr = [];
for (i in obj) {
  var c;
  if (obj[i].cost) {
    c = obj[i].cost.toFixed(2);
  } else {
    c = null;
  }
  arr.push(c);
}

假设此结构相当准确 ,那么代码可以简化为更实用的功能。

您可以将键作为集合访问,而不是迭代对象的键,然后使用数组方法将函数应用于整个集合:

var arr,
    obj;

//this is a utility. It would be nice to have Object.values,
//but it's not supported in enough browsers yet
function values(obj) {
  return Object.keys(obj).map(function (key) {
    return obj[key];
  });
}

//this function gets a cost from a particular value
//it's reusable and concise
function getCost(value) {
  return value.cost
    ? value.cost.toFixed(2)
    : null;
}

//get the data however you get it
obj = ...;

//this is where everything actually happens
arr = values(obj).map(getCost);

这比你原来写的要长。这不一定是坏事。

程序员倾向于寻找尽可能短的代码。我鼓励你努力争取最易读的代码。如果它是可读的,它很容易理解,如果它易于理解,它很容易调试。

例如:您提供的代码会将0值转换为null。这可能是一个错误,你应该写的是:

if (obj[i].cost != null) {

如果您在代码中反复使用此代码段,则需要在多个位置修复相同的代码段。

相反,如果您将这一小块逻辑抽象为一个简单的函数。您只需要纠正该错误一次,其余代码将使用固定版本。

答案 3 :(得分:0)

我会做这样的事情:

arr.push((cost = obj[i].cost) && cost.toFixed(2) || null)

由于您正在尝试编写优雅的JS,我建议您查看CoffeeScript:

arr.push obj[i].cost?.toFixed(2)

请参阅compiled js。从技术上讲,如果它不存在,则不定义而不是null,但CoffeeScript通常允许您编写相当优雅的代码。

答案 4 :(得分:0)

var c; //initiate variable
c = obj[i].cost ? obj[i].cost.toFixed(2) : null; //ternary for if/else block
arr.push(c); //push value to array