如果访问未定义值的属性,则会出现异常:
let object = {}
let n = object["foo"].length;
VM186:1未捕获的TypeError:无法读取未定义的属性'length' 在:1:12
在这种情况下,我想获得一个默认值而不是一个异常,但是我现在的做法似乎太冗长了:
let n = 0;
if (object.hasOwnProperty("foo")) {
n = object["foo"].length;
}
是否有更简单,更优雅的方法来做到这一点?可能使用ES6。
答案 0 :(得分:0)
let n =object["foo"] ? object["foo"].length : 0;
要不写两次object["foo"]
,您还可以执行以下操作:
let n = object["foo"];
n = n ? n.length : 0;
答案 1 :(得分:0)
使用es6,您可以通过使用Object.keys(object)来检查对象是否存在任何键,该对象将给出键数组Object.keys,并对其长度进行检查将得出该对象为空或否,还检查一个条件,对象的构造函数是否为对象。
请参见以下代码。如果满足这两个条件,则表示对象为空,您可以分配默认值
let object = {}
if(Object.keys(object).length === 0 && object.constructor === Object){
// assign a default value if the object is empty
object["foo"] = "bar"
}
console.log("object is empty default value will be assigned", object)
答案 2 :(得分:0)
不确定是否更优雅,但是object destructuring可以分配默认值。
但是,它不会阻止您使用null
值。只是undefined
const obj = {};
const { foo: { length = 0 } = [] } = obj;
console.log(length)
答案 3 :(得分:0)
我们要检查两个可能的不确定值。首先,密钥需要存在于字典中。之后,该对象应该是具有属性set hivevar:start_date=2015-07-01; --replace with your start_date
set hivevar:end_date=current_date; --replace with your end_date
set hive.exec.parallel=true;
set hive.auto.convert.join=true; --this enables map-join
set hive.mapjoin.smalltable.filesize=25000000; --size of table to fit in memory
with date_range as
(--this query generates date range, check it's output
select date_add ('${hivevar:start_date}',s.i) as dt
from ( select posexplode(split(space(datediff(${hivevar:end_date},'${hivevar:start_date}')),' ')) as (i,x) ) s
)
--insert overwrite table your table --uncomment this after checking if you need to overwrite your table
select s.ID,
s.dt,
case when t.id is null then 0 else t.value end as value --take existing value for joined, 0 for not joined
--also you can do simply NVL(t.value,0) as value if no NULLs are allowed in your_table.value
from
(--this subquery will give all combinations of ID and date, which should be the result
select d.dt, IDs.ID
from date_range d cross join (select distinct ID from your_table) IDs
) s
left join
your_table t on s.dt=t.date and s.id=t.id --join with existing records, check your table column names
order by s.id, s.dt --remove this if ordering is not necessary
;
的数组或结构。
一种不错的方法是使用length
定义未定义时的默认值。但是,如果您尝试检查||
的未定义值而没有先处理此值,将无法正常工作。
length
一个更简单的示例,更接近您的用例;
let object = {};
let r = (object["foo"] || 333);
let l = r.length || 111;
let oneLiner = (object["foo"] || 333).length || 111;
console.log("Default Value: " + r);
console.log("Default Length: " + l);
console.log("OneLiner: " + oneLiner);
答案 4 :(得分:0)
@lleaon提到的方法仅在值为undefined
时有效,而对于其他虚假的值,如null
则无效。
这是我经常用来安全地访问JavaScript中嵌套对象的一种技术。我是一年前从另一个SO答案中挑选出来的。
const obj = {};
const arrLength = (obj.foo || []) || 0;
console.log(arrLength); // 0
您可以像这样检查深层嵌套水平,
const obj = {};
const arrLength = ((obj.nestedObj || {}).foo || []) || 0;
console.log(arrLength); // 0
以防万一,我前阵子写了一篇博客文章。