当前位置: 首页 > 知识库问答 >
问题:

JavaScript:设置数据结构:相交

邢起运
2023-03-14

试图让两个数据集相交,但我做不到:(。例如,在我下面的代码中,相交mySet和mySet2应该得到“1”,因为它们的集合中都有值“1”)。

var mySet = new Set();
var mySet2=new Set();
mySet.add(1);
mySet.add(2);
mySet.add("HELLOOOOO");
mySet2.add("hi");
mySet2.add(1);


var a = Array(mySet, mySet2);
console.log(a);

mySet.forEach(function(value) {
    console.log(value);
});


mySet2.forEach(function(value) {
    console.log(value);
});

function intersection_destructive(a, b)
{
    var result = new Array();
    while( mySet.length > 0 && mySet2.length > 0 )
    {
        if      (mySet[0] < mySet2[0] ){ mySet.shift(); }
        else if (mySet[0] > mySet2[0] ){ mySet2.shift(); }
        else /* they're equal */
        {
            result.push(mySet.shift());
            mySet2.shift();
        }
    }

    return result;
}

集合1和集合2中都有“1”,但我的函数(交集)不返回它。我不确定如何将它们相交,我搜索了stackoverflow,发现相交_具有破坏性,但这对我不起作用,我还尝试了:

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

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

但当我尝试运行“过滤器”时,它会出错。

共有3个答案

张建树
2023-03-14

你一直在尝试数组求交的方法。您不能在ES6设备上使用它们。相反,使用

function intersect(...sets) {
    if (!sets.length) return new Set();
    const i = sets.reduce((m, s, i) => s.size < sets[m].size ? i : m, 0);
    const [smallest] = sets.splice(i, 1);
    const res = new Set();
    for (let val of smallest)
        if (sets.every(s => s.has(val)))
             res.add(val);
    return res;
}
宓英哲
2023-03-14

要获得交集,可以迭代集合中的项,并检查它们是否属于另一个:

var intersect = new Set();
for(var x of mySet1) if(mySet2.has(x)) intersect.add(x);

在ES7中,您可以通过数组理解或生成器理解来简化它:

var intersect = new Set((for (x of mySet1) if (mySet2.has(x)) x));
宇文鸿畴
2023-03-14

可悲的是,你发现这里没有本地的交叉点或联合操作。不过,找到十字路口并不十分复杂:

let a = new Set([1,2,3])
let b = new Set([1,2,4])
let intersect = new Set([...a].filter(i => b.has(i)));
 类似资料:
  • 包含了多种基于 JavaScript 的算法与数据结构。每种算法和数据结构都有自己的 README,包含相关说明和链接,以便进一步阅读 (还有 YouTube 视频) 。

  • null 高++;storage.put(high,element); 低++; 高--;

  • 数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据(JS里可以是任意类型)。 关键点:连续的存储空间(数组可以进行随机访问) // js let data = [] // c int data[200] = { 0 }; // 编译时 就已经确定所有的值为零 // java int data[] = new int[3]; // 开辟了一个长度为3的数组 在Ch

  • Go的调度的实现,涉及到几个重要的数据结构。运行时库用这几个数据结构来实现goroutine的调度,管理goroutine和物理线程的运行。这些数据结构分别是结构体G,结构体M,结构体P,以及Sched结构体。前三个的定义在文件runtime/runtime.h中,而Sched的定义在runtime/proc.c中。Go语言的调度相关实现也是在文件proc.c中。 结构体G G是goroutine

  • 顺序结构 顺序栈(Sequence Stack) SqStack.cpp 顺序栈数据结构和图片 typedef struct { ElemType *elem; int top; int size; int increment; } SqStack; 队列(Sequence Queue) 队列数据结构 typedef struct { ElemType * elem; int fron

  • 数据结构 Collection 和 Sequence Clojure 常用的数据结构有 List, Map, Vector, Set. 他们都属于 Collection, 之间的关系大致是这样: 属于 Clojure 当中实现的数据结构都是 Collection. 编码当中会遇到 Host 平台的数据类型, 不属于 Collection. 实现了 Collection 的接口的数据结构都支持这些函