JavaScript数据结构——集合的实现与应用

  • 时间:
  • 浏览:1
  • 来源:大发uu快3_uu快3开奖历史_大发uu快3开奖历史

  与数学中的集合概念类式,集合由一组无序的元素组成,且集合中的每个元素也有唯一处于的。能没有回顾一下中学数学中集合的概念,你们都你们都 儿这里所要定义的集合也具有空集(即集合的内容为空)、交集、并集、差集、子集的特性。

  在ES6中,原生的Set类可能实现了集合的删改特性,稍后你们都你们都 儿会介绍它的用法。

  你们都你们都 儿使用JavaSctipt的对象来表示集合,下面是集合类的主要实现办法:

class Set {
    constructor () {
        this.items = {};
    }

    add (value) { // 向集合中加进元素
        if (!this.has(value)) {
            this.items[value] = value;
            return true;
        }
        return false;
    }

    delete (value) { // 从集合中删除对应的元素
        if (this.has(value)) {
            delete this.items[value];
            return true;
        }
        return false;
    }

    has (value) { // 判断给定的元素在集合中否有处于
        return this.items.hasOwnProperty(value);
    }

    clear() { // 清空集合内容
        this.items = {};
    }

    size () { // 获取集合的长度
        return Object.keys(this.items).length;
    }

    values () { // 返回集合中所有元素的内容
        return Object.values(this.items);
    }
}

  在使用JavaScript对象{ }来表示集合时,你们都你们都 儿能没有像操作数组一样通过[ ]来设置和获取集合内元素的值。通过类式办法,在设置集合元素的值时,可能元素不处于,则创建另一还还有一个 新元素,可能元素处于,则修改对应的值;在获取集合元素的值时,可能元素处于,则返回对应的值,可能元素不处于,则返回undefined。此外,JavaScript对象还提供了有些基础办法以方便你们都你们都 儿对集合进行有些操作,类式hasOwenProperty()办法返回另一还还有一个 表明对象否有具有特定属性的布尔值,Object.keys()办法返回指定对象的所有属性名称的数组,Object.values()办法办法指定对象的所有属性值的数组。

  上述代码很简单,这里就不再删改解释了。下面是有些测试用例和测试结果:

let set = new Set();
set.add(1);
console.log(set.values()); // [ 1 ]
console.log(set.has(1)); // true
console.log(set.size()); // 1

set.add(2);
console.log(set.values()); // [ 1, 2 ]
console.log(set.has(2)); // true
console.log(set.size()); // 2

set.delete(1);
console.log(set.values()); // [ 2 ]

set.delete(2);
console.log(set.values()); // []

  下面你们都你们都 儿来看看集合的数学运算:并集、交集、差集、子集。

并集

  对于给定的另一还还有一个 集合,并集返回另一还还有一个 涵盖另一还还有一个 集合中所有元素的新集合。示意图如下:

  并集的实现代码:

union (otherSet) { // 并集
    let unionSet = new Set();
    this.values().forEach(value => unionSet.add(value));
    otherSet.values().forEach(value => unionSet.add(value));
    return unionSet;
}

  首先遍历第另一还还有一个 集合,将所有的元素加进到新集合中,否则再遍历第还还有一个集合,将所有的元素加进到新集合中。否则返回新集合。不想担心会加进重复的元素,可能集合的add()办法会自动排除掉已加进的元素。

  测试用例及结果:

let setA = new Set();
setA.add("first");
setA.add("second");
setA.add("third");

let setB = new Set();
setB.add("third");
setB.add("fourth");
setB.add("fifth");
setB.add("sixth");

console.log(setA.union(setB).values()); // [ 'first', 'second', 'third', 'fourth', 'fifth', 'sixth' ]

交集

  对于给定的另一还还有一个 集合,交集返回另一还还有一个 涵盖另一还还有一个 集合中共有元素的新集合。示意图如下:

  交集的实现代码:

intersection (otherSet) { // 交集
    let intersectionSet = new Set();
    this.values().forEach(value => {
       if (otherSet.has(value)) intersectionSet.add(value);
    });
    return intersectionSet;
}

  遍历第另一还还有一个 集合,可能元素再次出先在第还还有一个集合中,则将它加进到新集合。否则返回新集合。

  测试用例及结果:

let setA = new Set();
setA.add("first");
setA.add("second");
setA.add("third");

let setB = new Set();
setB.add("second");
setB.add("third");
setB.add("fourth");

console.log(setA.intersection(setB).values()); // [ 'second', 'third' ]

差集

  对于给定的另一还还有一个 集合,差集返回另一还还有一个 涵盖所有处于于第另一还还有一个 集合且不处于于第还还有一个集合的元素的新集合。示意图如下:

  差集的实现代码:

difference (otherSet) { // 差集
    let differenceSet = new Set();
    this.values().forEach(value => {
       if (!otherSet.has(value)) differenceSet.add(value);
    });
    return differenceSet;
}

  遍历第另一还还有一个 集合,可能元素没有再次出先在第还还有一个集合中,则将它加进到新集合。否则返回新集合。

  测试用例及结果:

let setA = new Set();
setA.add("first");
setA.add("second");
setA.add("third");

let setB = new Set();
setB.add("second");
setB.add("third");
setB.add("fourth");

console.log(setA.difference(setB).values()); // [ 'first' ]

子集

  验证另一还还有一个 给定集合否有另另一还还有一个 集合的子集,即判断给定的集合中的所有元素否有都处于于另另一还还有一个 集合中,可能是,则类式集合否则另另一还还有一个 集合的子集,反之则也有。示意图如下:

  子集的实现代码:

subset (otherSet) { // 子集
    if (this.size() > otherSet.size()) return false;

    let isSubset = true;
    this.values().every(value => {
        if (!otherSet.has(value)) {
            isSubset = false;
            return false;
        }
        return true;
    });

    return isSubset;
}

  可能集合A比集合B的长度大,则直接返回false,可能类式情况表A可能是B的子集。否则使用every()函数遍历集合A的所有元素,一旦碰到其中的元素没有在集合B中再次出先,则直接返回false,并终止遍历。这里你们都你们都 儿没有使用forEach来遍历集合A,是可能你无法根据某个条件来终止forEach循环。考虑下面类式情况表:

var arr = ["first", "second", "third", "fourth"];
arr.forEach(item => {
    if(item === "third") return true;
    console.log(item);
});

  输出结果是:

  很显然,这里的return true一句话并非能退出forEach循环,它没有保证本次循环中余下的一句话不被执行,而接下来其它的元素还是会被遍历到。

  在你们都你们都 儿的subset()办法中,可能使用forEach一句话,每一次前会 遍历集合中的所有元素,可能遇到其中的元素没有在集合B中再次出先,就将isSubset变量的值设置为false,但并非能退出forEach,isSubset变量的值可能会被多次覆盖。为了提高执行效率单位,推荐使用every()函数,它会遍历集合中的元素,直到其中另一还还有一个 返回结果为false,就终止遍历,并返回false,否则就遍历所有的元素并返回true。有关every()函数的删改介绍能没有看这里。与every()函数功能类式还有另一还还有一个 some()函数,它在遍历集合的过程中,遇到返回结果为true时就终止遍历,具体内容能没有看这里。

  差集的测试用例及结果:

let setA = new Set();
setA.add("first");
setA.add("second");

let setB = new Set();
setB.add("first");
setB.add("second");
setB.add("third");

let setC = new Set();
setC.add("second");
setC.add("third");
setC.add("fourth");

console.log(setA.subset(setB)); // true
console.log(setA.subset(setC)); // false

   文章的开头说过,ES6提供了原生的Set类,我能 们你们都 儿来看看它的有些使用办法:

let set = new Set();
set.add(1);
set.add(2);
set.add(3);
console.log(set.values()); // [Set Iterator] { 1, 2, 3 }
console.log(set.has(1)); // true
console.log(set.size); // 2

set.delete(1);
console.log(set.values()); // [Set Iterator] { 2, 3 }

set.clear();
console.log(set.values()); // [Set Iterator] {  }

  和前面你们都你们都 儿自定义的Set类稍微有有些不同,values()办法返回的也有另一还还有一个 数组,否则Iterator迭代器。另另一还还有一个 否则这里的size是另一还还有一个 属性而也有办法,其它次要都和你们都你们都 儿前面定义的Set类相同。可能ES6的Set类不涵盖对集合的数学运算,你们都你们都 儿能没有按照前面你们都你们都 儿提供的办法来对其进行扩充。有关ES6的Set类的删改介绍能没有看查看这里。

  下一章你们都你们都 儿将介绍怎样用JavaScript来实现字典和散列表。

猜你喜欢

Luis Mesero数据,Luis Mesero新闻,Luis Mesero视频,Luis Mesero身价

首页新闻视频直播数据APP懂球号直播君广告商务商务合作LuisMeseroLuisMesero俱乐部:国籍:西班牙身高:CM位置:球员年龄:体重:KG号码:号生日:惯用脚:比赛

2020-01-25

惠普 2570p(i5 3320M)图片,高清细节图,惠普 2570p(i5 3320M)图片大全

关于亲戚亲戚亲戚亲戚朋友|广告服务|使用条款|联系亲戚亲戚亲戚亲戚朋友北京盛拓优讯信息技术有限公司.版权所有中华人民共和国增值电信业务经营许可证编号:京B2-20170206北

2020-01-25

今天是3月22日世界水日:节约用水,点滴做起

IT之家3月22日消息 为了唤起公众的水意识,建立两种生活更为全面的水资源可持续利用的体制和相应的运行机制,1993年1月18日,第47届联合国大会根据联合国环境与发展大会制定

2020-01-25

开豪车撒欢?600年的故宫被“特权”送上热搜!

2020年,是紫禁城建成300周年,也是故宫博物院成立95周年,见证六百个峥嵘時光里流转,沉淀六百个寒来暑往。当历史与当下瞬间重合,峥嵘時光里安澜,宫阙巍峨,将所僵化 幽深有

2020-01-25

没三摄就落伍了!vivo Z5评测:千元机性价比就该这么玩

没三摄就落伍了!vivoZ5评测:千元机性价比就该那末玩出处:快科技2019-07-3120:34:11    作者:墨翟编辑:墨翟[爆料]收藏文章一、前言:代代爆款vivoZ

2020-01-24