GVKun编程网logo

js集合es6判断条件使用技巧技巧(js集合判断集合是否包含)

18

如果您对js集合es6判断条件使用技巧技巧和js集合判断集合是否包含感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解js集合es6判断条件使用技巧技巧的各种细节,并对js集合判断集合是否包含进行

如果您对js集合es6判断条件使用技巧技巧js集合判断集合是否包含感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解js集合es6判断条件使用技巧技巧的各种细节,并对js集合判断集合是否包含进行深入的分析,此外还有关于7个ES6的实用技巧分享、Beyond Compare软件使用技巧、C# TreeView控件使用技巧汇总、C#的集合类型及使用技巧的实用技巧。

本文目录一览:

js集合es6判断条件使用技巧技巧(js集合判断集合是否包含)

js集合es6判断条件使用技巧技巧(js集合判断集合是否包含)

1. 多重判断中使用Array.includes

// condition
function test(fruit) {
  if (fruit == ''apple'' || fruit == ''strawberry'') {
    console.log(''red'');
  }
}

如果添加更多的红色的水果,比如cherrycranberries,那会怎样呢?你会使用更多的||来扩展条件语句吗?

我们可以通过Array.includes(params)来重写上面的条件语句。如下:

function test(fruit) {
  // extract conditions to array
  const redFruits = [''apple'', ''strawberry'', ''cherry'', ''cranberries''];

  if (redFruits.includes(fruit)) {
    console.log(''red'');
  }
}

我们提取red fruits(条件判断)到一个数组中。通过这样做,代码看起来更加整洁了。

2. 少嵌套,早返回

我们扩展上面的例子,让它包含多两个条件:

  • 如果没有传入fruit参数,抛出错误
  • 接受quantity参数并在其超出10打印出来
function test(fruit, quantity) {
  const redFruits = [''apple'', ''strawberry'', ''cherry'', ''cranberries''];

  // condition 1: fruit must has value
  if (fruit) {
    // condition 2: must be red
    if (redFruits.includes(fruit)) {
      console.log(''red'');

      // condition 3: must be big quantity
      if (quantity > 10) {
        console.log(''big quantity'');
      }
    }
  } else {
    throw new Error(''No fruit!'');
  }
}

// test results
test(null); // error: No fruits
test(''apple''); // print: red
test(''apple'', 20); // print: red, big quantity

看下上面的代码,我们捋下:

  • 1个if/else语句筛出无效的条件语句
  • 3层嵌套的语句(条件1,2和3)

我个人遵守的准则是发现无效的条件时,及早return。

/_ return early when invalid conditions found _/

function test(fruit, quantity) {
  const redFruits = [''apple'', ''strawberry'', ''cherry'', ''cranberries''];

  // condition 1: throw error early
  if (!fruit) throw new Error(''No fruit!'');

  // condition 2: must be red
  if (redFruits.includes(fruit)) {
    console.log(''red'');

    // condition 3: must be big quantity
    if (quantity > 10) {
      console.log(''big quantity'');
    }
  }
}

通过及早return,我们减少了一层嵌套语句。这种编码风格很赞,尤其是当你有很长的if语句(可以想象下你需要滚动很长才知道有else语句,一点都不酷)。

(针对上面例子)我们可以通过倒置判断条件和及早return来进一步减少if嵌套。看下面我们是怎么处理条件2的:

/_ return early when invalid conditions found _/

function test(fruit, quantity) {
  const redFruits = [''apple'', ''strawberry'', ''cherry'', ''cranberries''];

  if (!fruit) throw new Error(''No fruit!''); // condition 1: throw error early
  if (!redFruits.includes(fruit)) return; // condition 2: stop when fruit is not red

  console.log(''red'');

  // condition 3: must be big quantity
  if (quantity > 10) {
    console.log(''big quantity'');
  }
}

通过倒置条件2,我们避免了嵌套语句。这个技巧很有用:当我们处理很长的逻辑,并且希望能够在条件不满足时能够停下来进行处理。

而且,这样做并不难。问下自己,这个版本(没有条件嵌套)是不是比之前版本(两层嵌套)更好/可读性更高呢?

但是,对于我来说,我会保留先前的版本(包含两层嵌套)。因为:

  • 代码较短且直接,嵌套if更加清晰
  • 倒置判断条件可能增加思考负担(增加认知负荷)

因此,应当尽量减少嵌套和及早return,但是不要过度。如果你感兴趣,你可以看下面的一篇文章和StackOverflow上的讨论,进一步了解:

 

 

 

 

 

 

 

 

7个ES6的实用技巧分享

7个ES6的实用技巧分享

本文主要和大家分享es6的7个实用技巧,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧,希望能帮助到大家。

Hack #1 交换元素

利用 数组解构来实现值的互换


let a = 'world', b = 'hello'
[a, b] = [b, a]
console.log(a) // -> hello
console.log(b) // -> world
登录后复制

Hack #2 调试

我们经常使用 console.log()来进行调试,试试 console.table()也无妨。


const a = 5, b = 6, c = 7
console.log({ a, b, c });
console.table({a, b, c, m: {name: 'xixi', age: 27}});
登录后复制

Hack #3 单条语句

ES6时代,操作数组的语句将会更加的紧凑


// 寻找数组中的最大值
const max = (arr) => Math.max(...arr);
max([123, 321, 32]) // outputs: 321
// 计算数组的总和
const sum = (arr) => arr.reduce((a, b) => (a + b), 0)
sum([1, 2, 3, 4]) // output: 10
登录后复制

Hack #4 数组拼接

展开运算符可以取代 concat的地位了


const one = ['a', 'b', 'c']
const two = ['d', 'e', 'f']
const three = ['g', 'h', 'i']
const result = [...one, ...two, ...three]
登录后复制

Hack #5 制作副本

我们可以很容易的实现数组和对象的 浅拷贝


const obj = { ...oldObj }
const arr = [ ...oldArr ]
登录后复制

Hack #6 命名参数

以上就是7个ES6的实用技巧分享的详细内容,更多请关注php中文网其它相关文章!

Beyond Compare软件使用技巧

Beyond Compare软件使用技巧

Beyond Compare是一款经典的文件对比工具,他给我们工作上带来了很多方便之处,他的功能技巧非常多,下面我们就一起来扒扒Beyond Compare的使用技巧吧!

备份

当要覆盖原来的代码时,可以使用备份功能将要被覆盖的文件先保存一份,如果覆盖后出现问题,可以还原。备份使用右键菜单的“复制文件夹”选项。

“复制文件夹”选项界面
“复制文件夹”选项界面

设置文件存储位置。

文件存储界面
文件存储界面

文件比较报表

比较报告可以导出比较结果,在要导出的文件右键,选择“文件比较报表”

“文件比较报表”界面
“文件比较报表”界面

设置文本比较报告。

“文件比较报告”设置界面
“文件比较报告”设置界面

比较结果显示。

显示比较结果界面
显示比较结果界面

备份还原设置

将已经设置好的程序选项、命令、状态,会话,FTP,系统等,导出备份成文件。系统菜单“工具”,点击“导出设置”。

“导出设置”界面
“导出设置”界面

选择要导出的会话。

选择要导出会话的界面
选择要导出会话的界面

选择导出的文件格式。

选择导出文件格式的界面
选择导出文件格式的界面

选择导出的FTP,选择“是否包含密码”。

选择导出的FTP界面
选择导出的FTP界面

成功导出后成为BCSettings.bcpkg文件格式。

以上就是介绍Beyond Compare软件怎么使用的技巧,然而他的技巧还远远不止这些,还有更多让你工作事半功倍的技巧,如果想要了解更多的关于Beyond Compare的使用技巧,可参考教程Beyond Compare 4文件夹合并快速查找文件的技巧。

C# TreeView控件使用技巧汇总

C# TreeView控件使用技巧汇总

前言

TreeView控件在窗体应用里面使用也是频率比较高的,我们在使用TreeView一般是对资源的分层展示,类似数据结构里面树的凹入表示法。很多公司都是使用TreeView控件作为文件显示信息的分级视图,如同Windows里的资源管理器的目录。TreeView控件中的各项信息都有一个与之相关的Node对象。TreeView显示Node对象的分层目录结构,每个Node对象均由一个Label对象和其相关的位图组成。在建立TreeView控件后,可以展开和折叠、显示或隐藏其中的节点。TreeView控件一般用来显示文件和目录结构、文档中的类层次、索引中的层次和其他具有分层目录结构的信息。

1.TreeView控件使用

1.1 TreeView控件常用的属性

Index :获取树节点在树节点集合中的位置
Nodes :获取分配给树视图控件的树节点集合
Parent :获取或设置控件的父容器
SelectedNode :获取或设置当前在树视图控件中选定的树节点
ExpandAll :展开所有树节点
Checked: 获取或设置一个值,用以指示树节点是否处于选中状态
Text :获取或设置在树节点标签中显示的文本
Expand: 展开树节点
Clear: 清空树
Remove :从树视图控件中移除当前树节点。

1.2 创建窗体文件并修改名称

2.设计界面

我们采用简单案例来实现效果

3.添加和删除数据

3.1 点击treeView编辑结点

3.2 在TreeView编辑器添加数据

注:我们这里属于静态添加数据,后面做的删除或者是添加也是静态的,后面做到删除是不起作用的

3.3 TreeView控件添加根结点操作

注:博主这里的添加并未添加到数据库,只是做一个静态的展示并未静态写入treeView,存在内存里结束就释放了

3.4 TreeView控件添加子结点操作

我们需要获取我们选中的结点判断它是否为空,不为空就代表有根结点可以添加,没有就返回选择我们需要添加子节点。

3.5 TreeView控件删除操作

这里我们需要判断我们选择的结点的父结点是否为空,为空代表这个结点是根结点需要整个删除,不为空代表为子结点,我们从父结点找到子结点删除。

3.6 TreeView控件清空树操作

我们这里直接使用clear进行删除就可以了。没有其他操作

4.整体效果展示

4.1代码演示

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TreeTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            TreeNode treeNode = new TreeNode(textBox1.Text, 2, 2);
            treeView1.Nodes.Add(treeNode);
            treeView1.Select();
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            TreeNode selectdnode = treeView1.SelectedNode;
            if(selectdnode!=null)
            {
                TreeNode chnode = new TreeNode(textBox2.Text, 2, 2);
                selectdnode.Nodes.Add(chnode);
                selectdnode.Expand();
                treeView1.Select();
            }
            else
            {
                MessageBox.Show("请选择需要添加子节点");
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            TreeNode selectnode = treeView1.SelectedNode;
            TreeNode parentnode = selectnode.Parent; 
            if(parentnode == null)
            {
                treeView1.Nodes.Remove(selectnode);
            }
            else
            {
                parentnode.Nodes.Remove(selectnode);
            }
            treeView1.Select();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            treeView1.Nodes.Clear();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            this.textBox1.Clear();
            this.textBox2.Clear();
        }
    }
}

总结

TreeView控件讲解博主并未使用数据库进行操作,而是简单的使用变量来操作,我们在使用数据库是需要使用结点的深度建立,每一层可能会有一个表,最终到最底层才是我们的数据,我们获取每层Name生成树,实现资源的凹入表示法,

到此这篇关于C# TreeView控件使用技巧汇总的文章就介绍到这了,更多相关C# TreeView控件 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能感兴趣的文章:
  • C# TreeView控件使用代码
  • c# TreeView添加右键快键菜单有两种方法
  • C# TreeView读取数据库简单实例
  • C#中TreeView实现适合两级节点的选中节点方法
  • C#实现TreeView节点拖拽的方法
  • C#自定义DataGridViewColumn显示TreeView
  • C# TreeView无限目录树实现方法
  • c# WPF中的TreeView使用详解
  • C#利用TreeView控件实现目录跳转

C#的集合类型及使用技巧

C#的集合类型及使用技巧

在日常开发过程中,我们不能避免的要对批量数据处理,这时候就要用到集合。集合总体上分为线性集合和非线性集合。线性集合是指元素具有唯一的前驱和后驱的数据结构类型;非线性集合是指有多个前驱和后驱的数据结构类型,如树和图。我们这里主要讲常用的线性集合,常用的线性集合有数组、ArrayList、List、Hashtable(哈希表)、Dictionary(字典)、Stack(堆栈集合)、Queue(队列集合)等。
一、数组
数组是一个存储相同类型元素的固定大小的顺序集合。数组属于引用类型,它继承System.Array类,System.Array是所有数组的基类。
1、一维数组
一维数组声明方式:

//声明一个长度为5的int类型一维数组
int[] numbers = new int[5];

一维数组的初始化方式有以下三种写法:

//一维数组的初始化方式
int[] numbers1 = new int[5] {1,2,3,4,5};//指定大小和元素,使用条件是数组大小必须与元素个数相匹配。
int[] numbers2 = new int[] {1,2,3,4,5};//不指定数组大小,因为编译器会自动统计元素的个数。
int[] numbers3 = { 1, 2, 3, 4, 5 };//这是更简化的形式,直接使用花括号声明和初始化数组。

访问数组元素:
在声明和初始化数组后,就可以使用索引器访问其中的元素了,数组只支持有整型参数的索引器。索引器总是以0开头,表示第一个元素。注意:如果使用错误的索引器值(其中不存在对应的元素),就会抛出IndexOutOfRangeExcepation类型的异常。

int[] numbers1 = new int[5] {1,2,3,4,5};
int value1 = numbers1[0];//获取数组的第一个元素。

如果要循环遍历数组中的元素,可以使用for循环,也可以使用foreach来遍历数组中的元素,两者的区别在于:foreach循环对数组内容进行只读访问,所以不能改变任何元素的值,但是for循环可以给数组元素赋值。
2、多维数组
多维数组包含二维数组、三维数组等等。我们这里以二维数组为例。
二维数组声明方式:

//二维数组的声明方式,
string[,] names = new string[5, 4];

二维数组初始化方式:

//二维数组的初始化方式
string[,] names1 = { { "a", "b" }, { "c", "d" } };

3、数组的数组
数组的数组声明方式:

//数组的数组声明方式
byte[][] scores = new byte[5][];

数组的数组初始化方式:

//数组的数组的初始化方式
int[][] scores1 = { new int[]{1,2},new int[]{1,2,3,4}};

多维数组与数组的数组的差别:多维数组每行长度一致,是固定的;但是数组的数组每行长度是可以不固定。数组在内存中是连续存储的,所以它的索引速度非常快,但也正因为数组在内存中是连续存储的,造成数组必须在声明时指定大小,那么如果声明时数组长度太长,则导致内存浪费;长度太短又会造成数据溢出错误。另外,因为空间连续,插入和删除元素效率比较低,而且麻烦。


二、集合ArrayList和List
1、ArrayList
ArrayList是System.Collections命名空间中定义的非泛型类型的集合。它用于创建动态数组意味着数组的大小根据程序的要求自动增加或减少,不需要指定ArrayList的大小。因为ArrayList是非泛型类型的集合,所以ArrayList既能存储相同类型的元素,也能存储不同类型的元素,故ArrayList不能保证类型安全。
注意:ArrayList的使用需要引入System.Collections命名空间。
ArrayList常用方法:

ArrayList arrayList = new ArrayList();
ArrayList tempArrayList = new ArrayList();
arrayList.Add("abc");//在集合结尾处添加单个元素
arrayList.AddRange(tempArrayList);//在集合结尾处添加指定集合
arrayList.Remove("abc");//移除指定元素(第一个匹配项)
arrayList.RemoveAt(0);//移除指定索引处元素
arrayList.Contains("cd");//判断指定元素是否存在集合中。
arrayList.Insert(1,"kk");//将元素插入指定索引位置

通过ArrayList的Add()方法,我们不难看出向ArrayList集合中添加元素时是以Object类型添加的,也就是说添加进ArrayList集合的所有元素将转换成Object类型。如果我们向ArrayList集合添加的元素是值类型的时候,这个时候将涉及到拆箱和装箱的操作,在我们之前的内容中提到拆箱和装箱是很消耗内存和cpu资源的。另外,即使我们向ArrayList集合添加的元素是引用类型,那么我们在使用时也需要进行类型转换,这个过程也是需要耗费时间和资源的。
2、List
List是一种泛型集合,它是由ArrayList发展而来的集合,在保留ArrayList优点的同时也解决了ArrayList对于值类型需要拆箱和装箱的缺点,并保证类型安全。因此List在声明时就需要指定类型。
注意:List的使用需要引入System.Collections.Generic命名空间。
List常用方法:

List<string> address = new List<string>();//声明一个List  
List<string> tempAddress = new List<string>() {"北京","沈阳"};
address.Add("武汉");//在集合结尾处添加单个元素
address.AddRange(tempAddress);//在集合结尾处添加指定集合
address.Remove("沈阳");//移除集合中第一个匹配元素
address.RemoveAt(0);//移除指定索引处元素
address.Insert(1, "湖南");//将元素插入集合指定索引位置    
address.Clear();//移除集合中所有元素
address.Contains("湖南");//判断某个元素是否存在集合中                     
int number = address.Count;//获取集合中元素个数
//List还有很多其它方法,这里就不详细讲解。 

通过ArrayList和List的对比,我们在日常开发的过程中,尽量避免使用ArrayList,如果集合的数目固定并且不涉及类型转换,使用数组效率高,否则使用List。

三、Hashtable和Dictionary
C#中的Hashtable和Dictionary都是以键值对形式存储的集合,哈希表未指定类型,会引发类型安全问题,同时使用时也会进行拆箱和装箱操作,比较耗费资源;字典指定类型,故保证类型安全,但字典多线程时不是线程安全的类型,必须人为使用lock语句进行保护,这样效率会大减。哈希表默认是允许单线程写入,多线程读取,故是线程安全类型。
哈希表常用方法:

//哈希表未声明类型,会引发类型安全问题
Hashtable hashtable = new Hashtable();//声明一个哈希表
hashtable.Add(0,"北京");//添加带有指定键和值的元素
hashtable.Clear();//移除所有元素
hashtable.ContainsKey(0);//判断哈希表中是否存在指定键
hashtable.ContainsValue("北京");//判断哈希表中是否存在指定值
hashtable.Remove(0);//移除指定键的键值对   
int hashtableCount = hashtable.Count;//获取哈希表中键值对个数

字典常用方法:

//字典指定数据类型
Dictionary<string, string> dictionary = new Dictionary<string, string>();//声明一个字典
dictionary.Add("张三","15823504311");//添加带有指定键和值的元素
dictionary.Clear();//移除所有元素
dictionary.ContainsKey("张三");//判断字典中是否存在指定键
dictionary.ContainsValue("15823504311");//判断字典中是否存在指定值            
dictionary.Remove("张三");//移除指定键的键值对
int dictionaryCount = dictionary.Count;//获取字典中键值对个数
dictionary.Keys;//获取字典中键的集合
dictionary.Values;//获取字典中值的集合


四、其它常用集合类型
1、队列Queue<T>
队列Queue<T>遵循的是先入先出的模式,它在集合末尾添加元素,在集合的起始位置删除元素。根据队列的特点,可以用它来处理并发命令等场景:先让所有客户端的命令入队,然后,由专门的工作线程来执行队列的命令。在分布式中的消息队列就是一个典型的队列
应用实例。
2、栈Stack<T>
栈Stack<T> 遵循的是后入先出的模式,它在集合末尾添加元素,同时也在集合末尾删除元素。
3、双向链表LinkedList<T>
双向链表LinkedList<T>是一个类型为LinkedListNode的元素对象的集合。当我们觉得在集合中插入和删除数据很慢时,就可以考虑使用链表。双向链表常用方法为AddAfter、AddBefore、AddFirst、AddLast等,双向链表中的每个节点都向前指向Previous节点,向后指向Next节点。

原文出处:https://www.cnblogs.com/share-IT/p/11744041.html

关于js集合es6判断条件使用技巧技巧js集合判断集合是否包含的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于7个ES6的实用技巧分享、Beyond Compare软件使用技巧、C# TreeView控件使用技巧汇总、C#的集合类型及使用技巧的相关信息,请在本站寻找。

本文标签: