JS如何向数组push元素且不删除已有元素?两数组交集存入问题
JavaScript数组交集合并问题解决方案
问题定位
- 你的原有代码逻辑不会删除
sameFriend中的已有元素,你感知到的「james被移除」是调试输出错误导致的误判:循环中你使用bFriend的遍历索引k去读取sameFriend的元素,而sameFriend初始已存在1个元素,后续新增元素的下标从1开始,和k的取值不匹配,才会出现打印结果不符合预期的情况。 - 实际执行完你的原始代码后,
sameFriend的最终值为['golf', 'dick', 'rex', 'james'],初始元素和三个交集元素全部完整保留,没有元素被删除。
实现方案
方案1:保留原有双重循环逻辑(修正调试输出)
let aFriend = ['dick', 'rex', 'james', 'tom', 'jack']; let bFriend = ['dick', 'rex', 'james', 'jake']; let sameFriend = ['golf']; for (let i = 0; i < aFriend.length; i++){ for (let k = 0; k < bFriend.length; k++){ if (aFriend[i] === bFriend[k]){ sameFriend.push(bFriend[k]); // 修正:打印最新插入的元素,不要使用k作为索引取值 console.log(sameFriend[sameFriend.length - 1]); } } } // 打印完整数组验证结果 console.log(sameFriend)
方案2:高性能交集计算实现(避免双层循环)
通过Set数据结构将查询复杂度从O(n)降到O(1),整体时间复杂度从O(n*m)优化为O(n+m),数组长度越大性能优势越明显:
let aFriend = ['dick', 'rex', 'james', 'tom', 'jack']; let bFriend = ['dick', 'rex', 'james', 'jake']; let sameFriend = ['golf']; const bFriendSet = new Set(bFriend); aFriend.forEach(item => { if (bFriendSet.has(item)) { sameFriend.push(item); } }) console.log(sameFriend)
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

