我试图找到一种优雅的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
语句的情况下执行此操作?
答案 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