如何在ECMAScript及Apache NiFi ExecuteScript中无内置方法判断空对象/列表
两个ECMAScript对象空值判断问题的解决方案
1. 不使用内置方法判断对象/数组是否为空
要在不依赖任何内置方法(比如Object.keys、isEmpty等)的情况下判断对象或数组是否为空,可以利用**for...in循环**的特性:空对象/数组不会有可枚举的自有属性,循环体不会执行。
判断对象为空
function isEmptyObj(obj) { // 先排除非对象类型,比如null、undefined、基本类型 if (typeof obj !== 'object' || obj === null) { return true; } // 遍历对象的可枚举属性 for (let key in obj) { // 如果进入循环,说明有属性,对象不为空 return false; } // 循环未执行,对象为空 return true; }
判断数组为空
数组本质也是对象,上面的函数同样适用。如果要单独针对数组做更严格的判断(排除类数组对象),可以额外检查typeof obj.length === 'number',但如果完全不用内置属性的话,还是用for...in最直接:
function isEmptyArr(arr) { if (typeof arr !== 'object' || arr === null) { return true; } for (let index in arr) { return false; } return true; }
2. Apache NiFi ExecuteScript环境中判断嵌套空对象
在NiFi的ExecuteScript ECMAScript环境中,由于无法使用isEmpty、Object.keys、hasOwnProperty等方法,需要用最基础的方式逐层检查嵌套对象,并通过for...in判断目标对象是否为空。
针对示例中的student.data.subId.dataName,步骤如下:
- 逐层确认父对象存在,避免访问不存在的属性报错;
- 用
for...in循环判断dataName是否有可枚举属性。
示例代码
const student={ "status" : "success", "data" : { "noMoreWork" : 0, "subId" : { "labelName" : "", "dataName" : { } }, "restflow": [] } }; // 逐层检查并判断dataName是否为空 let isDataNameEmpty = false; // 先确认每一层对象存在 if (student && student.data && student.data.subId && student.data.subId.dataName) { const target = student.data.subId.dataName; let hasProp = false; for (let key in target) { hasProp = true; break; // 找到一个属性就退出循环 } isDataNameEmpty = !hasProp; } else { // 任意一层不存在,视为"空"或无效 isDataNameEmpty = true; } // 输出结果:true(因为dataName是空对象) console.log(isDataNameEmpty);
注意:示例中student对象的原代码有语法错误(restflow=[]应该是"restflow": []),已修正。
内容的提问来源于stack exchange,提问作者dash
相关产品推荐
相关产品推荐

