const arr = [
{
name:'tom',
age:15
},
{
name:'rose',
age:17
},
{
name:'tom',
age:11
},
{
name:'rose',
age:15
},
{
name:'jack',
age:18
},
{
name:'tom',
age:10
}]
var hash = {};
var abc=arr.reduce(function(item, next) {
hash[next.name] ? '' : hash[next.name] = true && item.push(next);
return item
}, [])
console.log(abc)
 
push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
 
 
假设对成长速度显示规定如下: 
成长速度为5显示1个箭头; 
成长速度为10显示2个箭头; 
成长速度为12显示3个箭头; 
成长速度为15显示4个箭头; 
其他都显示都显示0各箭头。 
用代码怎么实现?

差一点的if,else: 
Js代码

复制代码代码如下:
var add_level = 0; 
if(add_step == 5){ 
add_level = 1; 

else if(add_step == 10){ 
add_level = 2; 

else if(add_step == 12){ 
add_level = 3; 

else if(add_step == 15){ 
add_level = 4; 

else { 
add_level = 0; 

稍好些的switch: 
Js代码

复制代码代码如下:
var add_level = 0; 
switch(add_step){ 
case 5 : add_level = 1; 
break; 
case 10 : add_level = 2; 
break; 
case 12 : add_level = 3; 
break; 
case 15 : add_level = 4; 
break; 
default : add_level = 0; 
break; 

}如果需求改成: 
成长速度为>12显示4个箭头; 
成长速度为>10显示3个箭头; 
成长速度为>5显示2个箭头; 
成长速度为>0显示1个箭头; 
成长速度为<=0显示0个箭头。

那么用switch实现起来也很麻烦了。

那么你有没有想过用一行就代码实现呢? 
ok,让我们来看看js强大的表现力吧: 
Js代码

代码如下:
var add_level = (add_step==5 && 1) || (add_step==10 && 2) || (add_step==12 && 3) || (add_step==15 && 4) || 0; 

更强大的,也更优的:

Js代码

代码如下:
var add_level={'5':1,'10':2,'12':3,'15':4}[add_step] || 0; 

第二个需求: 
Js代码

代码如下:
var add_level = (add_step>12 && 4) || (add_step>10 && 3) || (add_step>5 && 2) || (add_step>0 && 1) || 0; 

首先我们来梳理一下一个概念,请你一定要记住:在js逻辑运算中,0、""、null、false、undefined、NaN都会判为false,其他都为true(好像没有遗漏了吧,请各位确认下)。这个一定要记住,不然应用||和&&就会出现问题。 
这里顺便提下:经常有人问我,看到很多代码if(!!attr),为什么不直接写if(attr); 
其实这是一种更严谨的写法: 
请测试 typeof 5和typeof !!5的区别。!!的作用是把一个其他类型的变量转成的bool类型。 
下面主要讨论下逻辑运算符&&和||。 
几乎所有语言中||和&&都遵循“短路”原理,如&&中第一个表达式为假就不会去处理第二个表达式,而||正好相反。 
js也遵循上述原则。但是比较有意思的是它们返回的值。 
代码:var attr = true && 4 && “aaa”; 
那么运行的结果attr就不是简单的true或这false,而是”aaa” 
再来看看||: 
代码:var attr = attr || “”;这个运算经常用来判断一个变量是否已定义,如果没有定义就给他一个初始值,这在给函数的参数定义一个默认值的时候比较有用。因为js不像php可以直接在型参数上定义func($attr=5)。再次提醒你记住上面的原则:如果实参需要是0、""、null、false、undefined、NaN的时候也会当false来处理。

if(a >=5){ 
alert("你好"); 

可以写成: 
a >= 5 && alert("你好"); 
这样只需一行代码就搞定。但是需要注意的一点就是:js中||和&&的特性帮我们精简了代码的同时,也带来了代码可读性的降低。这就需要我们自己来权衡了。 
一方面精简js代码,能实质性的减少网络流量,尤其是大量应用的js公用库。个人比较推荐的做法是:如果是相对复杂的应用,请适当地写一些注释。这个和正在表达式一样,能够精简代码,但是可读性会降低,对读代码的人要求会高些,最好的办法就是写注释。 

 
 

最新文章

  1. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q136-Q138)
  2. Oracle Enterprise Manager打不开的解决方法
  3. Web Server 配置及上传文件
  4. [Tex学习笔记]数学公式再次测试
  5. node.js WebService异常处理(domain)以及利用domain实现request生命周期的全局变量
  6. HDU 1698 Just a Hook(线段树区间替换)
  7. Session服务器配置指南与使用经验
  8. android framework浅析_转
  9. ASP.NET 修改密码代码
  10. Java排序算法之归并排序
  11. 背包问题——dfs
  12. Android为TV端助力(转载)
  13. SATA主机协议的FPGA实现之准备工作
  14. 关于tomcat session机制梳理
  15. django表格form无法保存评论排查步骤
  16. 判断listview滑动方向的代码片段
  17. tf.concat, tf.stack和tf.unstack的用法
  18. Puppet部署
  19. Android 高级UI设计笔记23:Android 夜间模式之 两种常用方法(降低屏幕亮度+替换theme)
  20. 11 基于django的图书管理系统 多表

热门文章

  1. 浏览器网页推断手机是否安装IOS/Androidclient程序
  2. DialogFragment创建默认dialog
  3. SQL Server 中树形表数据的处理总结
  4. ListView异步加载图片
  5. Android NDK开发篇(四):Java与原生代码通信(原生方法声明与定义与数据类型)
  6. python测试网页是否能正常登陆
  7. windows 配置squid反向代理服务器
  8. 常用IIS mime类型
  9. java网络编程(2)InetAddress 类及udp协议
  10. 基于CentOS7的服务器搭建(LAMP环境)