如何从嵌套对象数组二级对象移除count键?解决undefined报错
问题
需要从嵌套对象数组的二级对象中移除count键,现有数据结构如下:
let test = [ { "id": "c3c6f410f58e5836431b473ebcf134756232d04f2bf35edff8", "label": "Sector2", "options": { "62f92fab79ac81d933765bd0bbc4a1f5ea26cb3a088bcb4e6e": { "index": 0, "value": "Bob", "label": "Bob", "count": 1 }, "2fe91aa3567c0d04c521dcd2fc7e40d7622bb8c3f594d503da": { "index": 1, "value": "Student", "label": "Student", "count": 1 }, "c59ea1159f33b91a7f6edc6925be5e373fc543e4": { "index": 2, "value": "BBB", "label": "BBB", "count": 1 }, "c59ea1159f33b91a7f6edc6925be5e373fc54AAA": { "index": 3, "value": "Orange Duck", "label": "Orange Duck", "count": 1 } } }, { "id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e951709485", "label": "Brown Cow" }, { "id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e95170ZZZ", "label": "Red Fish" } ]
执行以下代码时触发报错Cannot read properties of undefined:
test = test.filter(item => item[0].options['count']);
需求是移除所有带有options属性的test元素中的count键,期望输出如下:
[ { "id": "c3c6f410f58e5836431b473ebcf134756232d04f2bf35edff8", "label": "Sector2", "options": { "62f92fab79ac81d933765bd0bbc4a1f5ea26cb3a088bcb4e6e": { "index": 0, "value": "Bob", "label": "Bob" }, "2fe91aa3567c0d04c521dcd2fc7e40d7622bb8c3f594d503da": { "index": 1, "value": "Student", "label": "Student" }, "c59ea1159f33b91a7f6edc6925be5e373fc543e4": { "index": 2, "value": "BBB", "label": "BBB", "count": 1 }, "c59ea1159f33b91a7f6edc6925be5e373fc54AAA": { "index": 3, "value": "Orange Duck", "label": "Orange Duck" } } }, { "id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e951709485", "label": "Brown Cow" }, { "id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e95170ZZZ", "label": "Red Fish" } ]
错误原因
这段代码的问题很明显:
filter是用来筛选数组元素(保留/删除整个元素)的,不是用来修改元素内部结构的,和需求完全不匹配。item[0]是错误用法——item是数组里的单个对象,不是数组,所以item[0]会返回undefined,这就是报错的直接原因。options['count']逻辑错误:options是包含多个子对象的容器,count是子对象的键,不是options本身的键。
正确实现方法
要实现需求,需要遍历数组,对每个元素判断是否包含options属性,若包含则遍历其下的子对象,移除count键。以下提供两种方案:
方案一:直接修改原数组
如果不需要保留原数组,可以直接遍历修改:
test.forEach(item => { // 先确认当前元素存在options且是对象类型 if (item.options && typeof item.options === 'object') { // 遍历options下的所有子对象 Object.values(item.options).forEach(subItem => { // 可选:如果需要保留特定子对象的count,加判断条件 if (subItem.value !== 'BBB') { delete subItem.count; } // 若要移除所有count,直接写delete subItem.count; }); } });
方案二:返回新数组(不修改原数据,推荐)
如果需要保留原数组,用map配合对象展开语法创建新数组:
const newTest = test.map(item => { // 没有options的元素直接拷贝返回 if (!item.options) return {...item}; // 处理options,移除每个子对象的count const processedOptions = Object.fromEntries( Object.entries(item.options).map(([key, subItem]) => { // 解构移除count,保留其他属性 const { count, ...restProps } = subItem; // 可选:保留特定子对象的count // const finalProps = subItem.value === 'BBB' ? subItem : restProps; return [key, restProps]; }) ); // 返回拷贝后的元素,替换处理后的options return { ...item, options: processedOptions }; });
内容的提问来源于stack exchange,提问作者Einarr
相关产品推荐
相关产品推荐

