文档章节

Javascript的循环中的k-v、v-k

hell0cat
 hell0cat
发布于 2015/09/10 11:40
字数 462
阅读 461
收藏 1

jQuery中有一个 map方法,循环时候是 k-v:

$(':checkbox[checked]').map( (k, v) => $(v).val() ).get();

到了js这里的map,就变成了 v - k

['a', 'b', 'c'].map( (v, k) => v) ;

js这样设计其实是为了方便省略 k,因为很多时候只需要v就够了,比如:

['2', '3', '4'].map( v => parseInt(v) );

但过度的省略可能会带来歧义,比如 :

['2', '3', '4'].map(parseInt);

=> [2, NaN, NaN]

这是一个非常著名的js大坑。

原因是 parseInt 的原型其实是 parseInt(string, base), 第二个参数其实是转换的进制,等价成了这样:

['2', '3', '4'].map( (v, k) => parseInt(v, k) );

循环调用分别为:parseInt('2', 0);  parseInt('3', 1);  parseInt('4', 2);

所以最好写成:

['2', '3', '4'].map( v => parseInt(v) ) ;

因为经常会忘记第一个到底是k,还是v,最好写成这样:

['2', '3', '4'].map( (v, k) => parseInt(v) ) ;

鉴于jQuery和原生js的map函数都是非常常用的,k,v 还是 v,k,经常容易混淆,这样的不一样设计非常不好。

再看看其他语言的 GO的,go没有map,但range也差不多,go使用的是 k, v:

for k, v := range []byte{'a', 'b', 'c'} {
    fmt.Printf("%d %c\n", k, v)
}

=> 
0 a
1 b
2 c

考虑到go不允许出现未使用的参数,所以很多时候需要这样:

for _, v := range []byte{'a', 'b', 'c'} {
    fmt.Printf("%c\n", v)
}

虽然是麻烦了,但依然遵循 k, v 这样熟悉的排列方式。

Ruby中的循环,可选带上Index,但是确是js这样的 v - k 方式:

2.2.2 :005 > ('a'..'c').each_with_index{|v, k| puts "#{v} #{k}" }
a 0
b 1
c 2

ruby好记住,主要是因为each_with_index 和 each,既然是带了index,那index在后面就刚刚好。

到底应该k-v还是,v-k,不能统一一下嘛。一会儿k-v,一会儿v-k,真是够了。

© 著作权归作者所有

hell0cat
粉丝 35
博文 51
码字总数 25365
作品 0
徐汇
程序员
私信 提问
加载中

评论(1)

南漂一卒
南漂一卒
jQuery 的静态 map 和 JS 的数组实例 map 都是 v-k,jQuery 的实例 map 是 k-v —— http://www.css88.com/jqapi-1.9/jQuery.map/
AAuto v1.0 更新(2011-10-8)

v1.0 版本更新说明 支持自定义生成时的exe文件输出目录 生成exe文件支持在工程属性中自定义版本、版权信息. 工程同步本地目录功能,可自动忽略.svn等隐藏目录 保存按钮将根据当前打开代码是否...

qqmmcc
2011/10/09
1K
2
好程序员web前端分享Vue学习笔记(一)

好程序员web前端分享Vue学习笔记(一)Vue框架是JS的封装框架,使用了MVVM模式,即model—view—viewmodel模式, 简而言之,就是数据与视图的绑定。 我准备开始学习一些最基础的Vue使用,以此...

好程序员IT
05/09
25
0
线性代数方程组的求解

#include "stdafx.h" #include #include #include #include "LinearEquation.h" #include "MatrixAlgo.h" //求解三对角线方程组的追赶法 int atrde(double b[],int n, int m, double d[]) {......

RapidBird
2010/03/30
440
0
如何有效实现前端压缩图片并上传功能

  随着现在手机的像素越来越高,很多照片动辄几兆甚至十几兆,上传后在服务器端压缩已经越来越不能满足当今的需求。这对于许多技术人员来说,处理起来这样的问题往往不知道该怎么下手,那么...

燚轩科技
2018/04/23
0
0
矩阵运算

#include "stdafx.h" #include #include #include #include "MatrixAlgo.h" //对称正定矩阵的求逆 int bssgj(double a[], int n) { int i,j,k,m; double w,g,*b; b=(double )malloc(nsizeof......

RapidBird
2010/03/26
270
0

没有更多内容

加载失败,请刷新页面

加载更多

以GPS为例,深入浅出讲解射频接收路径的匹配调试流程

RF接收路径的匹配流程----以GPS为例 调Matching前,至少准备两块板子。 一块完整PCB,有上全部零件 : 一块裸版,完全都没上零件 : 匹配前注意事项—铜管 可能很多人忽略这点,但其实这才是...

demyar
7分钟前
1
0
TI AM570x浮点DSP C66x + ARM Cortex-A15开发板的LCD触摸屏接口、LED指示灯

TL570x-EVM是一款由创龙基于SOM-TL570x核心板设计的开发板,它为用户提供了SOM-TL570x核心板的测试平台,用于快速评估SOM-TL570x核心板的整体性能。 TL570x-EVM底板采用沉金无铅工艺的4层板设...

Tronlong创龙
8分钟前
1
0
docker部署springboot项目

前提条件: 1.可以运行jar包的环境 2.机器上已经安装了docker 3.准备部署的springboot的jar包 4.Dockerfile文件 首先在xshell中连接服务器,然后再创建docker_test,在docker_test下创建jar...

故久呵呵
13分钟前
2
0
MaxCompute问答整理之10月

本文是基于本人对MaxCompute产品的学习进度,再结合开发者社区里面的一些问题,进而整理成文。希望对大家有所帮助。 问题一、DataStudio中是否可以通过shell节点调取MaxCompute sql语句? 不...

一肥仔
14分钟前
1
0
GMAT阅读高速解题6招秘籍分享

在做GMAT阅读题时,你是否曾因为文章内容无聊昏昏欲睡?是否看到第二段就神游不知所云?又是否看完问题选择觉得似乎每个都是正确答案?如果上面这些情况曾经发生在你身上,那么你的阅读方式和心...

bole6
15分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部