写出更好的 JavaScript 条件语句

摘要:
constfruits=[{name:'apple',color:'red'},{name:'strawberry',color:'red'},{name:'banana',color:'yellow'},{name:'pineapple',color:'yellow'},{name:'grape',color:'purple'},{name:'plum',color:'purple'}];functiontest{//使用Arrayfilter来找到对应颜色的水果returnfruits.filter;}4.使用Array.every和Array.some来处理全部/部分满足条件constfruits=[{name:'apple',color:'red'},{name:'banana',color:'yellow'},{name:'grape',color:'purple'}];functiontest(){letisAllRed=true;//条件:所有的水果都必须是红色for{if(!类似的,如果我们想要检查是否有至少一个水果是红色的,我们可以使用Array.some仅用一行代码就实现出来。map()方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。

1. 使用 Array.includes 来处理多重条件

//条件语句
functiontest(fruit) {
  if (fruit == 'apple' || fruit == 'strawberry') {
    console.log('red');
  }
}
functiontest(fruit) {
  //把条件提取到数组中
  const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];

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

2. 少写嵌套,尽早返回

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

  //条件 1:fruit 必须有值
  if(fruit) {
    //条件 2:必须为红色
    if(redFruits.includes(fruit)) {
      console.log('red');

      //条件 3:必须是大量存在
      if (quantity > 10) {
        console.log('big quantity');
      }
    }
  } else{
    throw new Error('No fruit!');
  }
}

//测试结果
test(null); //报错:No fruits
test('apple'); //打印:red
test('apple', 20); //打印:red,big quantity
/_ 当发现无效条件时尽早返回 _/

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

  if (!fruit) throw new Error('No fruit!'); //条件 1:尽早抛出错误
  if (!redFruits.includes(fruit)) return; //条件 2:当 fruit 不是红色的时候,直接返回
console.log('red');

  //条件 3:必须是大量存在
  if (quantity > 10) {
    console.log('big quantity');
  }
}

3. 相较于 switch,Map / Object 也许是更好的选择

functiontest(color) {
  //使用 switch case 来找到对应颜色的水果
  switch(color) {
    case 'red':
      return ['apple', 'strawberry'];
    case 'yellow':
      return ['banana', 'pineapple'];
    case 'purple':
      return ['grape', 'plum'];
    default:
      return[];
  }
}

//测试结果
test(null); //[]
test('yellow'); //['banana', 'pineapple']
//使用对象字面量来找到对应颜色的水果
  const fruitColor ={
    red: ['apple', 'strawberry'],
    yellow: ['banana', 'pineapple'],
    purple: ['grape', 'plum']
  };

functiontest(color) {
  return fruitColor[color] ||[];
}
或者,你也可以使用 Map 来实现同样的效果:

//使用 Map 来找到对应颜色的水果
  const fruitColor = newMap()
    .set('red', ['apple', 'strawberry'])
    .set('yellow', ['banana', 'pineapple'])
    .set('purple', ['grape', 'plum']);

functiontest(color) {
  return fruitColor.get(color) ||[];
}

map()方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。

 const fruits =[
    { name: 'apple', color: 'red'}, 
    { name: 'strawberry', color: 'red'}, 
    { name: 'banana', color: 'yellow'}, 
    { name: 'pineapple', color: 'yellow'}, 
    { name: 'grape', color: 'purple'}, 
    { name: 'plum', color: 'purple'}
];

functiontest(color) {
  //使用 Array filter 来找到对应颜色的水果

  return fruits.filter(f => f.color ==color);
}

4. 使用 Array.every 和 Array.some 来处理全部/部分满足条件

const fruits =[
    { name: 'apple', color: 'red'},
    { name: 'banana', color: 'yellow'},
    { name: 'grape', color: 'purple'}
  ];

functiontest() {
  let isAllRed = true;

  //条件:所有的水果都必须是红色
  for(let f of fruits) {
    if (!isAllRed) break;
    isAllRed = (f.color == 'red');
  }

  console.log(isAllRed); //false
}
const fruits =[
    { name: 'apple', color: 'red'},
    { name: 'banana', color: 'yellow'},
    { name: 'grape', color: 'purple'}
  ];

functiontest() {
  //条件:(简短形式)所有的水果都必须是红色
  const isAllRed = fruits.every(f => f.color == 'red');

  console.log(isAllRed); //false
}
清晰多了对吧?类似的,如果我们想要检查是否有至少一个水果是红色的,我们可以使用 Array.some 仅用一行代码就实现出来。
const fruits =[
    { name: 'apple', color: 'red'},
    { name: 'banana', color: 'yellow'},
    { name: 'grape', color: 'purple'}
];

functiontest() {
  //条件:至少一个水果是红色的
  const isAnyRed = fruits.some(f => f.color == 'red');

  console.log(isAnyRed); //true
}

本文参考掘金大佬Hopsken!

map()方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。

免责声明:文章转载自《写出更好的 JavaScript 条件语句》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python-mysql数据迁移查找nginx安装的路径以及相关安装操作命令下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

UE4-动画/蒙太奇/融合(Animation/montage/blend)相关笔记

Q.定义状态机动画蓝图事件:   Q.Animation/Montage指定帧触发事件(Event): (注意:单帧动画需要取消勾选Teleport to Explicit Time,否则无法触发帧事件) Q.C++自定义 Animation Blueprint(动画蓝图) 自己很少用C++写Skeleton动画相关的逻辑,通常Anim的BP满足大部分...

ERROR:C2678 二进制“<”: 没有找到接受“const _Ty”类型的左操作数的运算符(或没有可接受的转换)

【1】复现问题 为了更精确的分析,先用最简单的示例复现此错误场景,代码如下: 1 #include <map> 2 #include <string> 3 4 structSection 5 { 6 intid; 7 std::stringcode; 8 9 bool operator<(const...

Angular实现类似vuex状态管理功能、全局数据管理与同步更新

自定义实现angular中数据的状态管理,如有不妥请指正 一、先介绍一下rxjs中subject; Subject 数据的订阅与分发,结合报刊的发布与订阅进行功能的模拟,subject即是observeable对象也是observer对象,subject对于后期没有数据更新时所添加的订阅者是不怎么友好的,因为不跟新数据时订阅者就不在收到返回的数值...

【视频开发】【Live555】摄像头采集,264编码,live555直播(0)

参看 有关live555  1.首先需要修改live555,定义从 内存中直接获取source而不是从文件读取source的类。 自己实现的类命名为 H264FramedLiveSource    /* * Filename: H264FramedLiveSource.hh * Auther: chenbin * Create da...

iOS使用TestFlight进行内部和外部人员测试

前言在iOS 8中,苹果发布了一个叫做TestFlight的新玩意,用于将Beta测试流水化。此前你可能听说过这个东西,因为TestFlight作为一个独立的测试平台已经有些年头了。被苹果收购之后用于 发布测试版,你会发现TestFlight整合进了iTunes Connect,你可以通过电子邮件来邀请你的Beta测试成员。 TestFlight提供的...

QMesageBox的使用

一、使用构造函数弹出对话框 1、 QMessageBox msgBox;//最简单的对话框,里面什么也没有   QString str = “test”;   msgBox.setText(str);   msgBox.exec(); 2、   QMessageBox message(QMessageBox::NoIcon, "Title", "Conte...