You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,步骤如下:

  1. 逐层确认父对象存在,避免访问不存在的属性报错;
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 01:03:16