You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS合并数组出现多余前置0问题:期望输出[1,2,2,3,5,6]却得[0,1,2,2,3,5,6]

问题原因
  1. filter方法误用:filter的核心作用是返回符合条件的新数组,而非原地修改原数组。你在filter回调中使用splice删除元素,会导致遍历过程中数组长度变化、索引错位。例如排序后的数组是[0,0,0,1,2,2,3,5,6],第一次删除索引0的0后,数组变为[0,0,1,...],下一次遍历到索引1时删除第二个0,数组变为[0,1,...],后续遍历跳过了剩下的那个0,导致最终结果残留开头的0。
  2. 语法冗余:函数参数列表末尾的逗号nums1, nums2,属于不必要的语法,虽然浏览器通常兼容,但建议移除以保证代码规范。
修复方案

方案1:正确使用filter生成新数组(推荐)

利用filter的特性直接生成过滤后的新数组,避免索引混乱问题:

var merge = function(nums1, nums2) {
  const merged = nums1.concat(nums2);
  merged.sort((a, b) => a - b);
  return merged.filter(num => num !== 0);
};
console.log(merge([1, 2, 3, 0, 0, 0], [2, 5, 6])) // 输出: [1,2,2,3,5,6]

方案2:倒序遍历删除元素(适合必须原地修改的场景)

如果需要原地修改数组,倒序遍历可以避免删除元素导致的索引错位:

var merge = function(nums1, nums2) {
  const nums3 = nums1.concat(nums2);
  nums3.sort((a, b) => a - b);
  
  // 倒序遍历,删除元素不会影响未遍历的索引
  for (let i = nums3.length - 1; i >= 0; i--) {
    if (nums3[i] === 0) {
      nums3.splice(i, 1);
    }
  }
  
  nums1 = nums3;
  return nums1;
};
console.log(merge([1, 2, 3, 0, 0, 0], [2, 5, 6])) // 输出: [1,2,2,3,5,6]

额外提示(针对LeetCode合并有序数组场景)

如果这是LeetCode的经典题目,更高效的做法是用双指针从后往前合并,无需先拼接再排序,时间复杂度可优化为O(m+n):

var merge = function(nums1, m, nums2, n) {
  let p1 = m - 1, p2 = n - 1, p = m + n - 1;
  while (p1 >= 0 && p2 >= 0) {
    nums1[p--] = nums1[p1] > nums2[p2] ? nums1[p1--] : nums2[p2--];
  }
  // 处理nums2剩余元素
  while (p2 >= 0) {
    nums1[p--] = nums2[p2--];
  }
  return nums1;
};
console.log(merge([1,2,3,0,0,0], 3, [2,5,6], 3)) // 输出: [1,2,2,3,5,6]

内容的提问来源于stack exchange,提问作者Sira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:00:47