【问题标题】:Check elements present in array using Javascript [duplicate]使用Javascript检查数组中存在的元素[重复]
【发布时间】:2020-03-30 01:24:44
【问题描述】:

我有一种情况,我想检查一个数组中的元素是否存在于另一个数组中。如果存在元素,则将它们推送到新数组中。在这种情况下,我有字符串数组。

例如

var check = ["6003", "6005", "6010"]; //static values. I need to check these elements if they are present in InputValues

var InputValues = ["5005", 2005", "6010"]; //dynamic input values

var result = ["6010"]; //dyanimic final array based off elements in InputValues

类似,

var InputValues = ["5005", 6005", "6010"];

var result = ["6005", "6010"];

谁能告诉我如何实现这个动态结果。

【问题讨论】:

  • 可能在某处重复......但你可以这样做var set = new Set(check); var result = InputValues.filter(value => set.has(value));
  • This answer 似乎与我上面的建议非常相似,但在应用过滤器之前也会从两个输入数组中删除重复项。

标签: javascript arrays loops sorting nested-loops


【解决方案1】:
var result = InputValues.filter((val) => check.includes(val));

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes#Browser_compatibility

edit:使用了错误的方法! .includes() 如果您不关心 IE(尽管它在 Edge 中),则可以使用,否则这是可以使用的“现代” :-)

【讨论】:

  • 是的 - 哦!尽管为浏览器兼容性提供了链接到 MDN 的借口 ;-)
  • 您在下一段中仍将其称为.contains()。不,我不会将其称为“现代”使用。它比.indexOf(...) >= 0 更具语义,但我认为使用Set.has() 像在我对这个问题的评论中那样进行检查效率会提高一个数量级,因为.has() 是平均O(1) 时间复杂度,而.includes() 是 O(n) 时间复杂度。
  • Doh - 除了疲倦之外,我没有任何借口!将其更改为 Set 并使用它可能会更快,具体取决于数组的长度,但除非您缓存 Set,否则对于 GC 和整体性能而言,这将显着变差 - 并且考虑到问题它添加了很多OP可能无法理解的东西! ;-)
【解决方案2】:

您可以将Array.indexOfArray.filter 一起使用

var result = InputValues.filter(elem => check.indexOf(elem) >= 0);

基本上它的作用是过滤InputValues 的元素而不是check,区分大小写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 2012-12-31
    • 2016-08-06
    • 2014-11-22
    • 1970-01-01
    • 2021-09-21
    相关资源
    最近更新 更多