【问题标题】:Best way to filter for duplicates? [duplicate]过滤重复项的最佳方法? [复制]
【发布时间】:2018-09-04 14:23:02
【问题描述】:

我在尝试使用正则表达式之前发布过这个,但这次有点不同。

所以我有这个 500 个电话号码的列表。以下是其中的一些示例:

{
    8664665844
    8885444636
    8664604776
    8776434327
    8887441938
    8882642882
    8888097429
    8668943258
    8777711234
    8669894327
}

看起来有点不同,这是在我的 mongoDB 服务器上,所以它更像是一个具有唯一 uid 的对象数组...例如:

[
    {
        _id: kasjf234lkj109euf9023u4n,
        field1: 8669894327,
    }
]

类似的东西。

所以基本上,我的 web 应用程序正在使用一个包含数字的 csv 文件,您希望将其与您的基数进行比较。

我的第一个想法是使用 for、while、for 循环之类的东西,但我不确定它的效果如何:

for(var i = 0; i < basenums.length; i++){
    while ( i >= 0 ){
        for(var j = 0; j < comparing.length; j++){
            if comparing[j] == basenums.field1[i]{
                push that number to a 'dupes' array
            }else{
                break or something?
            }
        }
    }
}    

...这个逻辑开始让我头疼...

我知道有一个 'includes()' 方法,但我并没有真正使用它,当我在这种情况下尝试它时,它给我的一切都是错误的,即使我用来比较的列表只是一个我的服务器上的“basenums”列表的副本。

更“正确”的做法是什么?

我正在尝试将数组与数组进行比较。不是其特定数组中的值到自己的数组。

因此,与其将其标记为重复,也许您应该重新阅读:

我有 2 个数字数组:[1, 2, 3, 4, 5, 6] 和 [1, 2, 3, 4, 5, 6] 如何将数组作为索引 0 并将其与数组进行比较b 每个索引,然后取数组 a 的索引 1 并与数组 b 中的每个索引进行比较,依此类推,直到 i > arrayA.length。

【问题讨论】:

  • 在比较数组时找到匹配的情况。应该采取什么行动?
  • dupesArray.push(foundDupe)

标签: javascript arrays compare logic frontend


【解决方案1】:

不要试图一步完成所有事情。将您的问题分解成更小的部分:

  1. 将 mongo 的响应格式化为可以高效查询的哈希映射 (O(1))
  2. 对照此地图测试每个输入数字

第 1 步:

var hashmap = {}
basenums.forEach(function(basenum) {
  hashmap[basenum.field1] = true;
})

第 2 步:

var dupes = [];
comparing.forEach(function(comparingNum) {
  if(hashmap[comparingNum]) {
    dupes.push(comparingNum);
  }
})

编辑:我不确定你是否想把你的骗子作为一个集合(唯一数组)。如果是这样,您可以使用备用步骤 2:

var dupesMap = {};
comparing.forEach(function(comparingNum) {
  if(hashmap[comparingNum]) {
    dupesMap[comparingNum] = true;
  }
})
var dupes = Object.keys(dupesMap);

【讨论】:

  • 嗯..我会稍微研究一下..看起来它会起作用,但老实说,我几乎不明白这里发生了什么.......究竟是什么对象'哈希图'..? basenum.field1 的每个实例?
  • 在 JavaScript 中,任何对象 ({}) 都是一个映射 - 一个键/值存储。在这种情况下,我称之为 hashmap。我也可以称它为 kownNumberStore 或类似的名称。接下来,我正在构建一个类似{'8664665844': true, '8885444636': true} 的地图/对象,以便我可以通过hashMap['8885444636'] 询问该对象是否存在具有该数字的条目/值。它并没有做更多的事情——它只是作为一个查找工具。
  • 为了清楚起见,我必须制定搜索数组的逻辑,是吗?因为它只是显示为一切都是真的。大声笑
  • 这似乎不起作用,尽管我不确定为什么... hashmap 创建和对象的键值对为 'basenum': true 就像它说的那样。 tho,它似乎没有进入第二个 forEach 循环。我想我会制作这个单独的方法,然后再试一次。
  • 是的,无论出于何种原因,它似乎都不会进入下一个 forEach 循环..
【解决方案2】:

您可以将值推入数组并使用该数组创建一个新集合。集合不会在其中保留冗余元素。试试这个;

let a = ["a","b","a","b","a","b","a","b","a","c"];
console.log(a);
let uniqueA = [...new Set(a)];
console.log(uniqueA);

顺便说一句,对于一段代码,我从这个页面得到了帮助:https://medium.com/front-end-hacking/getting-unique-values-in-javascript-arrays-17063080f836

【讨论】:

  • 这可以,但我有arrayA和arrayB,我宁愿暂时保持这种状态。
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 2019-05-13
  • 2018-06-03
  • 1970-01-01
  • 2021-09-27
  • 2021-01-28
相关资源
最近更新 更多