如何检查数组及嵌套数组属性并按需生成新数组?
JSON数组转换时的属性存在性检查实现方案
你的原转换代码如下:
const newdata = json.map((c) => { return { "User Name": c.userName, Email: c.email, Groups: c.newArrGroups.map(a => a.name).toString(), Version: c.clientVersion }; });
针对你提出的两个需求,以下是正确的实现逻辑:
核心思路
- 普通属性:先创建空对象,通过
hasOwnProperty检查原对象的属性是否存在,仅当存在时才添加到新对象中。 - 嵌套数组字段:先验证原对象是否包含目标数组属性,再检查数组元素是否存在指定属性,满足条件才生成对应字段。
修改后的代码
const newdata = json.map((c) => { const item = {}; // 处理普通属性:存在则添加 if (c.hasOwnProperty('userName')) { item["User Name"] = c.userName; } if (c.hasOwnProperty('email')) { item.Email = c.email; } if (c.hasOwnProperty('clientVersion')) { item.Version = c.clientVersion; } // 处理嵌套数组Groups字段:仅当数组存在且有带name属性的元素时生成 if (c.hasOwnProperty('newArrGroups') && Array.isArray(c.newArrGroups)) { // 过滤出包含name属性的元素,提取name值 const validGroupNames = c.newArrGroups .filter(group => group.hasOwnProperty('name')) .map(group => group.name); // 有有效name值才添加Groups字段 if (validGroupNames.length > 0) { item.Groups = validGroupNames.toString(); } } return item; });
逻辑说明
- 普通属性处理:避免直接返回包含
undefined值的属性,只有原对象明确拥有该属性时,才将其加入新对象。 - 嵌套数组处理:
- 先确认
newArrGroups是存在的数组; - 用
filter筛掉没有name属性的元素,确保只提取有效的名称; - 只有当有效名称数组不为空时,才生成
Groups字段,避免出现空字符串或无意义的字段。
- 先确认
可选变体(按需选择)
如果你的需求是只有当嵌套数组的所有元素都包含name属性时才生成Groups字段,可以将嵌套数组的判断逻辑改为:
if (c.hasOwnProperty('newArrGroups') && Array.isArray(c.newArrGroups)) { // 检查数组所有元素都有name属性 const allHaveName = c.newArrGroups.every(group => group.hasOwnProperty('name')); if (allHaveName) { item.Groups = c.newArrGroups.map(group => group.name).toString(); } }
内容的提问来源于stack exchange,提问作者user8512043
相关产品推荐
相关产品推荐

