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

  • 时间:
  • 浏览:0
  • 来源:大发时时彩官网_大发时时彩邀请码_大发时时彩娱乐平台

  与数学中的集合概念什儿 ,集合由一组无序的元素组成,且集合中的每个元素前会 唯一趋于稳定的。还可以 回顾一下中学数学中集合的概念,当让当我们 这里所要定义的集合也具有空集(即集合的内容为空)、交集、并集、差集、子集的特征。

  在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来实现字典和散列表。

猜你喜欢

cnblogs客户端配置说明

1.下载地址http://openlivewriter.org/2.安装安装时设置好blog地址和账户、密码:到这里基本上就算安装完成了。因为以前的自动配置这么成功,会出显1个

2019-12-06

炉石传说术士卡组 炉石传说术士卡组该怎么搭配

术士卡组作为炉石传说中较为热门的卡组,尤其是当战士卡组被削之前 又有成为大热门的趋势,可是我我当然拥有可是我我种搭配方法 ,今天小编为我们歌词 我们歌词 介绍一下比较

2019-12-06

闹闹天宫嫦娥厉害吗 闹闹天宫嫦娥玩法介绍

斗玩网(douwan.com)报道:闹闹天宫嫦娥厉害吗?在游戏中,嫦娥定位暂且辅助就是dps,嫦娥有着非常不错的输出能力,感兴趣的男友一起去来看看闹闹天宫嫦娥玩法介绍。闹闹天宫

2019-12-06

对标三星 摩托罗拉将推1500美元折叠式手机

【环球网科技报道记者张之颖】最新消息指出,摩托罗拉将推出此人 的折叠式智能手机。一项可追溯到8月的专利显示,联想正致力于研发折叠式屏幕的技术。据了解,联想表示计划出售8万台摩

2019-12-06

魔幻三杰2 v1.14升级档+破解补丁[RELOADED]

关于大伙  |  加入大伙  |  意见反馈  |  招聘信息  |  商务合作|  游戏库列表温馨提示,适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活本站所有游戏均来

2019-12-06