(一)underscore入门和数组类工具API学习

underscore.js是一个JS框架,在原生javascript基础上提供了很多有用的工具API。apache提供了commons-lang、commons-io、commons-collections等jar包提供很多java语言常用的工具方法,underscore.js功能与之类似。经常开发JS代码的都知道,JS原生的Array、String等内置的API很少,不能满足实际开发过程中国的需要。所以引入一些工具库很有必要,避免我们重复的写一些本来应该公用的方法。

1.学习资料

underscore官网  http://underscorejs.org/

官网中文翻译     http://www.css88.com/doc/underscore/

underscore比较简单,有官方的参考文档就够了。本文是用的underscore.js当前最新版本1.7.0。

对于简单的API,直接复制官方的说明例子,对于一些不太好理解的API会详细说明。

2.数组相关API

Note: All array functions will also work on the arguments object. However, Underscore functions are not designed to work on "sparse"(稀疏的) arrays.

这些数组API不仅适用于js中的数组类型,也适用于arguments对象。arguments是每个js函数内部都有的一个对象,存储了调用该函数时传递的所有参数值,它很类似于数组,但实际上不是数组。至于什么是稀疏数组,什么是密集数组,参考我的另一篇文章:稀疏数组和密集数组

first

first_.first(array,
[n])
 Alias: head, take

Returns the first element of an array. Passing n will return the first n elements of the array.

_.first([5, 4, 3, 2, 1]);
=> 5

initial

initial_.initial(array,
[n])

Returns everything but the last entry of the array. Especially useful on the arguments object. Pass n to exclude the last n elements from the result.

_.initial([5, 4, 3, 2, 1]);
=> [5, 4, 3, 2]
_.initial([5, 4, 3, 2, 1],2);
=> [5, 4, 3]

last

last_.last(array,
[n])

Returns the last element of an array. Passing n will
return the last n elements of the array.

_.last([5, 4, 3, 2, 1]);
=> 1

rest

rest_.rest(array,
[index])
 Alias: tail, drop

Returns the rest of the elements in an array. Pass an index to
return the values of the array from that index onward.

_.rest([5, 4, 3, 2, 1]);
=> [4, 3, 2, 1]
_.rest([5, 4, 3, 2, 1],3);
=> [2, 1]

compact(删除false值)

compact_.compact(array)

Returns a copy of the array with all falsy values removed. In JavaScript, falsenull0,""undefined and NaN are
all falsy.

_.compact([0, 1, false, 2, ‘‘, 3]);
=> [1, 2, 3]

_.compact([0, 1, 2, 3, 2, 1, 3]);

=> [0,
1, 2, 3, 2, 1, 3]

flatten(数组降维)

flatten_.flatten(array,
[shallow])

Flattens a nested array (the nesting can be to any depth). If you pass shallow=true,
the array will only be flattened a single level.

_.flatten([1, [2], [3, [[4]]]]);
=> [1, 2, 3, 4];

_.flatten([1, [2], [3, [[4]]]], true);
=> [1, 2, 3, [[4]]];

without(数组减法)

without_.without(array,
*values)

Returns a copy of the array with all instances of the values removed.

_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
=> [2, 3, 4]

union(求并集)

union_.union(*arrays)

Computes the union of the passed-in arrays: the list of unique items, in order, that are present in one or more of the arrays.

_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2, 3, 101, 10]

intersection(求交集)

intersection_.intersection(*arrays)

Computes the list of values that are the intersection of all the arrays. Each value in the result is present in each of the arrays.

_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2]

difference(数组减法)

difference_.difference(array,
*others)

Similar to without, but returns the values from array that
are not present in the otherarrays.

_.difference([1, 2, 3, 4, 5], [5, 2, 10]);
=> [1, 3, 4]

uniq

uniq_.uniq(array,
[isSorted], [iteratee])
 Alias: unique

Produces a duplicate-free version of the array, using === to
test object equality. If you know in advance that the array is sorted, passing true for isSorted will
run a much faster algorithm. If you want to compute unique items based on a transformation, pass an iteratee function.

_.uniq([1, 2, 1, 3, 1, 4]);
=> [1, 2, 3, 4]
_.uniq([40, "", 11, false, 1, 0]);
=> [40, "", 11, false, 1, 0]

iteratee的函数声明形式:

// value:数组中元素的值
// index:所在的索引
// inputArray:元素的数组
// _.uniq([40, "", 11, false, 1, 0],false,iterateeFunction);
// inputArray就代表[40, "", 11, false, 1, 0]这个数组
// 数组中每个元素都会调用iterateeFunction,uique去重的时候,用该函数转换后的值做比较
function iterateeFunction(value,index,inputArray)
{

}

关于iteratee,可以看到默认情况下,unique()函数使用===作为相等的条件。在===模式下,false不等于0;如果在==模式下,false等于0。

_.uniq([40, "", 11, false, 1, 0],false,function(value,index,origialArray){

	if(value)
	{
		return value;//如果元素强制转换成boolean是true,返回元素本身
	}
	else
	{
		// 所有false类型的值,都统一视为0
	    return 0;
	}
 });

返回值是[40,0,11,1]。关于js中的boolean类型转换,参考我的另一篇文章

zip

zip_.zip(*arrays)

Merges together the values of each of the arrays with the values at the corresponding position. Useful when you have separate data sources
that are coordinated through matching array indexes. If you‘re working with a matrix of nested arrays, _.zip.applycan
transpose the matrix in a similar fashion.

_.zip([‘moe‘, ‘larry‘, ‘curly‘], [30, 40, 50], [true, false, false]);
=> [["moe", 30, true], ["larry", 40, false], ["curly", 50, false]]
 // 数组维度不同,会以长度最长的为准,没有元素会用undefined填充
 // zipArray是一个4 * 3的二维数组
 var zipArray = _.zip(['moe', 'larry', 'curly'], [30, 40, 50,1000], [true, false, false]);

返回的zipArray数组是:[["moe", 30, true],  ["larry", 40, false],  ["curly", 50, false],  [undefined,1000,undefined]]

 // a matrix of nested arrays
 var nestedZip = [['moe', 'larry'], [30, 40], [true, false]];
 var zipArray = _.zip.apply(_, nestedZip);

返回的zipArray数组是:[["moe", 30, true],  ["larry", 40, false]]

object

object_.object(list,
[values])

Converts arrays into objects. Pass either a single list of [key,
value]
 pairs, or a list of keys, and a list of values. If duplicate keys exist, the last value wins.

_.object([‘moe‘, ‘larry‘, ‘curly‘], [30, 40, 50]);
=> {moe: 30, larry: 40, curly: 50}

_.object([[‘moe‘, 30], [‘larry‘, 40], [‘curly‘, 50]]);
=> {moe: 30, larry: 40, curly: 50}

indexOf

indexOf_.indexOf(array,
value, [isSorted])

Returns the index at which value can be found in the array, or -1 if value is not present in the array. If you‘re working with a large array, and
you know that the array is already sorted, pass true for isSorted to
use a faster binary search ... or, pass a number as the third argument in order to look for the first matching value in the array after the given index.

_.indexOf([1, 2, 3], 2);
=> 1

lastIndexOf

lastIndexOf_.lastIndexOf(array,
value, [fromIndex])

Returns the index of the last occurrence of value in the array,
or -1 if value is not present. Pass fromIndex to start your search at a given
index.

_.lastIndexOf([1, 2, 3, 1, 2, 3], 2);
=> 4

sortedIndex

sortedIndex_.sortedIndex(list,
value, [iteratee], [context])

Uses a binary search to determine the index at which the value should be
inserted into the list in order to maintain the list‘s sorted order. If
an iteratee function is provided, it will be used to compute the sort ranking of each value, including the value you
pass. The iteratee may also be the string name of the property to sort by (eg. length).

_.sortedIndex([10, 20, 30, 40, 50], 35);
=> 3

var stooges = [{name: ‘moe‘, age: 40}, {name: ‘curly‘, age: 60}];
_.sortedIndex(stooges, {name: ‘larry‘, age: 50}, ‘age‘);
=> 1

注意:由于需要使用二分搜索,所以要求数组一定要是有序的,而且还要钱数组一定要是升序的。

 // 二分搜索,而且数组只能是升序
 console.log("asc=" + _.sortedIndex([10, 20, 30, 40, 50], 35));//3(正确的)
 console.log("desc=" + _.sortedIndex([50, 40, 30, 20, 10], 35));//5(这是错误的)

为什么了会这样呢,关键是二分搜索时候的比较条件,看下underscore.js源码

  // Use a comparator function to figure out the smallest index at which
  // an object should be inserted so as to maintain order. Uses binary search.
  _.sortedIndex = function(array, obj, iteratee, context) {
    iteratee = _.iteratee(iteratee, context, 1);
    var value = iteratee(obj);
    var low = 0, high = array.length;
    while (low < high) {
      var mid = low + high >>> 1;
      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
    }
    return low;
  };

while循环中的条件判断,很显然要求数组必须是升序的!

iteratee函数声明形式如下:

function iteratee(item)
{

}

sortedIndex()执行的时候,会将list中的每一个值和value,都传入到iteratee中。

range

range_.range([start],
stop, [step])

A function to create flexibly-numbered lists of integers, handy for each and map loops.start,
if omitted, defaults to 0step defaults to 1.
Returns a list of integers from start tostop, incremented (or decremented)
by step, exclusive. Note that ranges that stopbefore they start are
considered to be zero-length instead of negative — if you‘d like a negative range, use a negative step.

_.range(10);
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
_.range(1, 11);
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_.range(0, 30, 5);
=> [0, 5, 10, 15, 20, 25]
_.range(0, -10, -1);
=> [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
_.range(0);
=> []
时间: 2024-10-10 17:08:43

(一)underscore入门和数组类工具API学习的相关文章

数组类模板(四十九)

之前我们学习了类模板,今天我们来看看数组类模板.模板参数可以是数值型参数(非类型参数),如下 使用数值型模板参数是有限制的,如:a> 变量不能作为模板参数:b> 浮点数不能作为模板参数:c> 类对象不能作为模板参数.其本质是模板参数是在编译阶段被处理的单元,因此在编译阶段必须准确无误的唯一确定. 下来我们用函数模板来实现一个面试题:用最高效的方法求 1+2+3+...+N 的值. #include <iostream> #include <string> usin

泛型数组随机排列工具类

前言:最近开发一款简易游戏,要将一个数组中的内容随机排列.考虑到以后可重用性,所以自己写了一款"泛型数组随机排列工具类",现在分享给大家,希望能给大家带来启发.如果有好的方法类,请发给笔者邮箱,大家互相学习,感激不尽. ?源码: import java.lang.reflect.Array; import java.util.Random; /** * 泛型数组随机排列工具类. * * 要求:使用类类型. * * 示例: * * public static void main(Stri

数组的工具类Arrays

Arrays是数组的工具类,里面定义了很多的静态方法来方便使用者对数组进行操作. binarySearch([],fromIndex,toIndex,value) 使用二分法来查找指定的value是否存在在数组中.第一个参数是指定需要查找的数组,第二个 参数指定搜索的起始点,第三个参数指定搜索的结束位置,这个搜索的范围是一个左闭右开区间.最后一个参数是需要查找的值.如果找到返回数组的下标,如果没找到则返回一个负数.其中2,3参数可以省略. copyOf([],int length) 复制一个数组

Arrays是专门用于操作数组的工具类

排序或者查找数组里面的内容 多值传递 集合转数组 数组转集合 数组转字符串 /* Arrays 是用于操作数组的工具类,里面全是静态的,和Collections是用来操作集合的工具类是不一样的 当import导入的没有说明static,那么就说明是导入包中的所有类, 如果说明是static的时候就说明导入的是某个类的所有静态成员,记得要加上static的说明符号. import static java.lang.System.*; */ import java.util.*; public cl

网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板

第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 本单元作业练习创建模板类.单元作业会涉及冒泡排序.线性查找等算法.如果对排序.查找不熟悉,可以自行baidu或者google 依照学术诚信条款,我保证此作业是本人独立完成的. 1 编写一个数组类模板 Array,能够存储不同类型的数组元素.对数组元素进行查找.

_00017 Kafka的体系结构介绍以及Kafka入门案例(初级案例+Java API的使用)

博文作者:妳那伊抹微笑 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前,妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+Mahout+Spark ... 云计算技术 转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作! qq交流群:214293307  (期待与你一起学习,共同进步) # Kfaka的体系结构 # 学习前言 Kafka的整个学习过程就是自己看官网的文档,出

黑马程序员_JavaSE学习总结第11天_开发工具 &amp; API常用对象1

------- android培训.java培训.期待与您交流! ----------  11.01 常见开发工具介绍 1:操作系统自带的记事本软件 2:高级记事本软件例:Editplus,Notepad++,UltraEdit 3:集成开发环境 IDE(Integrated Development Environment) 这种软件是用于程序开发环境的应用程序,一般包括代码编辑器,编译器,调试器和图形界面工具. 集成了代码编写功能,分析功能,编译功能,调试功能等一体化的开发软件.具备这一特性的

JavaSE学习总结第11天_开发工具 &amp; API常用对象1

11.01 常见开发工具介绍 1:操作系统自带的记事本软件 2:高级记事本软件例:Editplus,Notepad++,UltraEdit 3:集成开发环境 IDE(Integrated Development Environment) 这种软件是用于程序开发环境的应用程序,一般包括代码编辑器,编译器,调试器和图形界面工具. 集成了代码编写功能,分析功能,编译功能,调试功能等一体化的开发软件.具备这一特性的软件都可以叫做IDE. 例:JCreator,JBuilder,NetBeans,JDev

C# 开发 &mdash;&mdash; 数组类对象接口

数组类型是从抽象基类 Array 派生的引用类型,通过new运算符创建数组并将数组元素初始化为他们的默认值 一维数组 type[] arrayname; 数组的长度不是声明的一部分,而且数组必须在访问前初始化. foreach 语句声明一个迭代变量 -- 是数组的每个元素的只读副本 二维数组 type[,]  arrayName; int[,] arr = new int[2,2]{{1,2},{3,4}}; 可使用数组的Rank属性和GetUpperBound方法获取数组的行数和列数,然后遍历