TypeScript如何向多维数组中插入不存在的元素?
解决方案
首先,你原来的代码存在两个关键问题:
- 末尾多余的
this.allobj.push(temp)会强制插入对象,直接覆盖前面的条件判断逻辑 - 如果
box的selected属性值动态变化,直接序列化整个对象会导致相同value结构的obj被误判为不同
根据你的需求,以下提供两种针对性方案:
方案一:仅当整个obj的value结构未重复时插入(忽略selected)
如果需求是只有当当前obj的所有value组成的二维结构从未在allobj中出现过,才插入,可使用以下代码:
// 深拷贝当前obj,避免引用共享导致后续修改影响已存入的对象 const temp = JSON.parse(JSON.stringify(this.obj)); // 提取当前obj的value二维数组作为唯一标识 const currentValueMatrix = temp.map(row => row.map(box => box.value)); // 检查allobj中是否存在完全相同的value结构 const isDuplicate = this.allobj.some(existingObj => { const existingValueMatrix = existingObj.map(row => row.map(box => box.value)); return JSON.stringify(existingValueMatrix) === JSON.stringify(currentValueMatrix); }); // 非重复则插入 if (!isDuplicate) { this.allobj.push(temp); }
方案二:仅当obj中存在新value时插入
如果需求是只要当前obj里有任何一个value从未在allobj的任何元素中出现过,就插入,可使用以下更高效的方案:
// 深拷贝当前obj const temp = JSON.parse(JSON.stringify(this.obj)); // 收集allobj中所有已出现的value,用Set优化查询效率 const existingValues = new Set<string>(); this.allobj.forEach(obj => { obj.forEach(row => row.forEach(box => existingValues.add(box.value))); }); // 检查当前obj是否包含新value const hasNewValue = temp.some(row => row.some(box => !existingValues.has(box.value))); // 存在新value则插入 if (hasNewValue) { this.allobj.push(temp); }
额外优化建议
将allobj的类型从any改为box[][],符合TypeScript类型规范:
allobj: box[][] = [];
内容的提问来源于stack exchange,提问作者usersam
相关产品推荐
相关产品推荐

