首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript检测另一个数组中数组的所有值

Javascript检测另一个数组中数组的所有值
EN

Stack Overflow用户
提问于 2021-03-29 00:32:01
回答 4查看 52关注 0票数 1

假设我有一个数组const series = [0,4,8]和另一个数组const positions = [0,3,4,7,8]

如何检测positions中是否包含series的所有值

我最初的反应是创建一个for loop,它将遍历positions中的所有值,并检查它们是否等于series的值,但这似乎非常低效。

EN

回答 4

Stack Overflow用户

发布于 2021-03-29 00:43:16

Javascript Set object缺乏集合论方法,从好的方面来说,它们很容易实现:

代码语言:javascript
运行
复制
class RealSet extends Set {
    isSuperSet(iterable) {
        for (let x of iterable) {
            if (!this.has(x))
                return false;
        }
        return true;
    }
    // @TODO: union, intersect, isSubSet, etc.
}

series = [0,4,8]
positions = [0,3,4,7,8]

console.log(new RealSet(positions).isSuperSet(series))

另请参阅: set方法的TC39 proposal

票数 1
EN

Stack Overflow用户

发布于 2021-03-29 00:40:20

最坏的情况是复杂度是n * log(n)。用于循环series array中所有元素的n和用于二进制搜索的log(n)

代码语言:javascript
运行
复制
const positions = [0, 3, 4, 7, 8];
const series = [0, 4, 8];

function bsearch(Arr, value) {
  var low = 0,
    high = Arr.length - 1,
    mid;
  while (low <= high) {
    mid = Math.floor((low + high) / 2);
    if (Arr[mid] == value) return mid;
    else if (Arr[mid] < value) low = mid + 1;
    else high = mid - 1;
  }
  return -1;
}
let i;
for (i = 0; i < series.length; ++i) {
  const pos = bsearch(positions, series[i]);
  if (pos === -1) break;
}

if (i === series.length) {
  console.log("All element present");
} else {
  console.log("All elmenet not present");
}

票数 0
EN

Stack Overflow用户

发布于 2021-03-29 00:43:21

我的答案是使用Javascript内置的Array.prototype.everyArray.prototype.indexOf

它会是这样的,

代码语言:javascript
运行
复制
// Returns true if all elements in firstArray are also in secondArray
firstArray.every(element => secondArray.indexOf(element) !== -1)

every builtin遍历数组,在每个元素上运行回调,如果所有元素的回调返回true (或truthy值),则返回true,否则返回false。

indexOf builtin在引用相等的数组中搜索您为其提供的参数,如果该参数在数组中,则返回该参数的索引,如果不在,则返回-1。

所以对于firstArray中的每个元素,我们检查它是否在secondArray中,如果是,则通过检查indexOf是否返回-1来返回true。

结合这些,我们可以在一行程序中解决这个问题。对于未排序的数组,这是您能得到的最好的结果。但是,如果您假设数组已排序,则使用二进制搜索可以更快。正如我面前的答案所使用的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66843664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档