【问题标题】:Remove mirror copies of sub-arrays in an array?删除阵列中子阵列的镜像副本?
【发布时间】:2021-05-04 17:17:04
【问题描述】:

考虑一个由 30K(或更多)子数组组成的数组,如下所示:

[[A,B],[C,D],[E,F],[G,H]......[D,C],[H,G]]
  • 子数组总是只包含 2 个元素。
  • 某些子阵列在阵列中的某处有其镜像。

最快从主阵列中删除所有镜像子阵列的方法是什么?如:在上面的示例中,比如说,删除 [D,C][C,D]NOT 两者?

我尝试过的:

  • .splice() 带有一个向后的 for 循环。
  • forEach 循环。
  • .stringify().join()
  • if (array.indexOf([array[i][1], array[i][0]) > -1)
  • if (array.indexOf(array[i].reverse()) > -1)

似乎没有任何效果,在 forEach 循环情况下结合字符串比较会冻结浏览器。

一个简单的代码,首先看看它是否有效:

for (var i=0; i < l; i++) {
    if (arr.indexOf([arr[i][1],arr[i][0]]) > -1) console.log(arr[i])
}

我尝试过的大多数其他事情都是上述代码的变体,但每次整个数组都被记录到控制台时。

更新: 子数组基本上只是英文单词,更具体地说是同义词对。 所以["always","forever"] 存在,[forever, always] 也存在。并非每对/单词都是这种情况,但整个数组中有很多这样的情况。我想遍历整个数组并删除任何 1 个这样的“对”数组。删除哪一个并不重要。最后,生成的数组应该没有“镜像”数组。我希望这能更好地阐明我想要实现的目标。

【问题讨论】:

  • “似乎没有任何效果”:请提供无效的代码。要求 fastest 方式更适合Code Review,但您必须提供工作代码。所以也许专注于一个问题:“我尝试了这个[代码],它为这个[输入]产生了[这个输出],而我期望[这个输出]。我的代码有什么问题?”。
  • 您能提供样本输入和预期输出吗?对的元素的数据类型是什么?如果他们不是原始人,你什么时候认为他们是平等的?当镜像出现时,你想保留哪一个? ...
  • @trincot 更新了问题

标签: javascript arrays ecmascript-6


【解决方案1】:

使用带有数组文字的indexOf 作为参数总是会返回-1。该数组文字是一个新数组,因此该引用不会出现在您的数组中。对象(数组)在引用相同内存位置时是相等的。

作为一种解决方案,您可以对每一对进行排序,然后将该对映射到 JSON。然后可以将此 JSON 字符串数组提供给 Map,以便 JSON 将用作唯一键。对应的值可以是原始对。

此解决方案将保留最后次出现的镜像/重复:

let arr = [["a", "b"], ["f", "c"], ["m", "q"], ["b", "a"], ["q", "s"], ["c", "f"], ["b", "z"]];

let map = new Map(arr.map(pair => [JSON.stringify([...pair].sort()), pair]));
let result = [...map.values()];

console.log(result);

如果您不介意原始数组已发生变异,则可以将 [...pair] 替换为 pair。然后,结果也会对其配对进行排序。

【讨论】:

  • 谢谢!它工作得很好,而且速度非常快。
猜你喜欢
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多