如何匹配对象数组中嵌套数组内的指定ID并返回对应对象ID
如何检查节点数组中某个ID是否存在于节点的next数组并返回对应节点ID?
我来帮你修正这个函数,你的思路方向是对的,但现有代码里有两个关键问题需要调整:
- 访问next数组的方式错误:你写的
nodes.next[i]是把整个nodes数组当成了一个带next属性的对象,但实际上nodes是对象数组,每个元素才是带next属性的节点,应该用nodes[i].next来访问第i个节点的next数组。 - 判断逻辑不对:直接用
===是在比较单个元素等于idToMatch,但我们需要检查的是整个next数组是否包含这个ID,而不是单个元素相等。
下面是修正后的完整函数:
findNext = function(idToMatch) { const nodes = this.state.nodes; // 遍历所有节点 for (let i = 0; i < nodes.length; i++) { // 检查当前节点的next数组是否包含目标ID if (nodes[i].next.includes(idToMatch)) { // 如果包含,返回当前节点的id return nodes[i].id; } } // 如果遍历完所有节点都没匹配到,返回null(或者你需要的默认值) return null; };
补充说明:
Array.includes()是ES6新增的方法,会直接返回布尔值,表示数组中是否存在指定元素,用法简洁直观。- 如果你需要兼容不支持
includes()的旧浏览器,可以用indexOf()替代,判断逻辑改成:nodes[i].next.indexOf(idToMatch) !== -1,效果完全一致。 - 上面的函数只会返回第一个匹配到的节点ID,如果你的场景中可能有多个节点的next数组都包含目标ID,可以改成收集所有匹配结果的版本:
findAllMatchingNodes = function(idToMatch) { const nodes = this.state.nodes; const matchedNodeIds = []; for (let i = 0; i < nodes.length; i++) { if (nodes[i].next.includes(idToMatch)) { matchedNodeIds.push(nodes[i].id); } } return matchedNodeIds; };
内容的提问来源于stack exchange,提问作者Vialito
相关产品推荐
相关产品推荐

