javascript中数组交集的最简单代码

新手上路,请多包涵

在 javascript 中实现数组交集的最简单、无库的代码是什么?我想写

intersection([1,2,3], [2,3,4,5])

并得到

[2, 3]

原文由 Peter 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 490
2 个回答

使用 Array.prototype.filterArray.prototype.includes 的组合:

 const filteredArray = array1.filter(value => array2.includes(value));

对于较旧的浏览器,使用 Array.prototype.indexOf 并且没有箭头函数:

 var filteredArray = array1.filter(function(n) {
 return array2.indexOf(n) !== -1;
 });

注意! .includes.indexOf 都使用 === 在内部比较数组中的元素,因此如果数组包含对象,它将仅比较对象引用(而不是它们的内容)。如果要指定自己的比较逻辑,请改用 Array.prototype.some

原文由 Anon. 发布,翻译遵循 CC BY-SA 4.0 许可协议

破坏性似乎最简单,特别是如果我们可以假设输入已排序:

 /* destructively finds the intersection of
 * two arrays in a simple fashion.
 *
 * PARAMS
 *  a - first array, must already be sorted
 *  b - second array, must already be sorted
 *
 * NOTES
 *  State of input arrays is undefined when
 *  the function returns.  They should be
 *  (prolly) be dumped.
 *
 *  Should have O(n) operations, where n is
 *    n = MIN(a.length, b.length)
 */
function intersection_destructive(a, b)
{
  var result = [];
  while( a.length > 0 && b.length > 0 )
  {
     if      (a[0] < b[0] ){ a.shift(); }
     else if (a[0] > b[0] ){ b.shift(); }
     else /* they're equal */
     {
       result.push(a.shift());
       b.shift();
     }
  }

  return result;
}

非破坏性必须更复杂一些,因为我们必须跟踪索引:

 /* finds the intersection of
 * two arrays in a simple fashion.
 *
 * PARAMS
 *  a - first array, must already be sorted
 *  b - second array, must already be sorted
 *
 * NOTES
 *
 *  Should have O(n) operations, where n is
 *    n = MIN(a.length(), b.length())
 */
function intersect_safe(a, b)
{
  var ai=0, bi=0;
  var result = [];

  while( ai < a.length && bi < b.length )
  {
     if      (a[ai] < b[bi] ){ ai++; }
     else if (a[ai] > b[bi] ){ bi++; }
     else /* they're equal */
     {
       result.push(a[ai]);
       ai++;
       bi++;
     }
  }

  return result;
}

原文由 atk 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题