Knockout中ko.utils中处理数组的方法集合
每一套框架基本上都会有一个工具类,如:Vue中的Vue.util、Knockout中的ko.utils、jQuery直接将一些工具类放到了$里面,如果你还需要更多的工具类可以试试lodash。本文只介绍一下Knockout中ko.utils中处理数组的一些方法。
ko.utils.arrayForEach(array, callback)
与Array.prototype.forEach作用一致。提供函数(回调函数)对数组的每个元素执行一次。使用方法:
var arr = [1, 2, 3, 4];
ko.utils.arrayForEach(arr, function(el, index) {
    console.log(el)
});
上面分别输出:1、2、3、4
ko.utils.arrayForEach源码:
ko.utils.arrayForEach = function (array, action) {
    for (var i = 0, j = array.length; i < j; i++)
        action(array[i], i);
}
ko.utils.arrayMap(array, callback)
与Array.prototype.map作用一致。返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。使用方法:
var arr = [1, 2, 3, 4];
var newArr = ko.utils.arrayMap(arr, function(el, index) {
    return el + 1;
});
上面得到的newArr为:[2, 3, 4, 5]
ko.utils.arrayMap源码:
ko.utils.arrayMap = function (array, mapping) {
    array = array || [];
    var result = [];
    for (var i = 0, j = array.length; i < j; i++)
        result.push(mapping(array[i], i));
    return result;
}
ko.utils.arrayFilter(array, callback)
与Array.prototype.filter作用一致。使用指定的函数测试所有元素,并创建一个包含所有通过测试的元素的新数组。使用方法:
var arr = [1, 2, 3, 4];
var newArr = ko.utils.arrayFilter(arr, function(el, index) {
    return el > 2;
});
上面得到的newArr为:[3, 4]
ko.utils.arrayFilter源码:
ko.utils.arrayFilter = function (array, predicate) {
    array = array || [];
    var result = [];
    for (var i = 0, j = array.length; i < j; i++)
        if (predicate(array[i], i))
            result.push(array[i]);
    return result;
}
ko.utils.arrayIndexOf(array, item)
与Array.prototype.indexOf作用一致。返回给定元素能找在数组中找到的第一个索引值,否则返回-1。使用方法:
var arr = [1, 2, 3, 4];
var index = ko.utils.arrayIndexOf(arr, 2);
上面得到的index值为1
ko.utils.arrayIndexOf源码:
ko.utils.arrayIndexOf = function (array, item) {
    if (typeof Array.prototype.indexOf == "function")
        return Array.prototype.indexOf.call(array, item);
    for (var i = 0, j = array.length; i < j; i++)
        if (array[i] === item)
            return i;
    return -1;
}
ko.utils.arrayRemoveItem(array, itemToRemove)
从数组中删除一个指定值的元素。使用方法:
var arr = [1, 2, 3, 4, 2];
ko.utils.arrayRemoveItem(arr, 2);
上面arr现在为[1, 3, 4, 2]
ko.utils.arrayRemoveItem源码:
ko.utils.arrayRemoveItem = function (array, itemToRemove) {
    var index = ko.utils.arrayIndexOf(array, itemToRemove);
    if (index > 0) {
        array.splice(index, 1);
    }
    else if (index === 0) {
        array.shift();
    }
}
ko.utils.arrayGetDistinctValues(array)
对数组进行去重(如果数组长度很大效率会很低),返回去重之后的新数组。使用方法:
var arr = [1, 2, 3, 4, 2, 4, '1'];
var newArr = ko.utils.arrayGetDistinctValues(arr);
得到的newArr值为[1, 2, 3, 4, '1']
ko.utils.arrayGetDistinctValues源码:
ko.utils.arrayGetDistinctValues = function (array) {
    array = array || [];
    var result = [];
    for (var i = 0, j = array.length; i < j; i++) {
        if (ko.utils.arrayIndexOf(result, array[i]) < 0)
            result.push(array[i]);
    }
    return result;
}
ko.utils.arrayFirst(array, callback[, thisArg])
与Array.prototype.find方法类似(命名与find偏差太大了)。返回第一个满足条件的元素。使用方法:
var arr = [
    {name: "apple"},
    {name: "banana"},
    {name: "cherries"}
];
var item = ko.utils.arrayFirst(arr, function(el, index){
    return el.name === "banana";
})
ko.utils.arrayFirst源码:
ko.utils.arrayFirst = function (array, predicate, predicateOwner) {
    for (var i = 0, j = array.length; i < j; i++)
        if (predicate.call(predicateOwner, array[i], i))
            return array[i];
    return null;
}
ko.utils.arrayPushAll(array, valuesToPush)
将数组valuesToPush合并到数组array中。使用方法:
var arr = [1, 2, 3];
ko.utils.arrayPushAll(arr, [4, 5]);
最后arr的值为[1, 2, 3, 4, 5]
ko.utils.arrayPushAll源码:
ko.utils.arrayPushAll = function (array, valuesToPush) {
    if (valuesToPush instanceof Array)
        array.push.apply(array, valuesToPush);
    else
        for (var i = 0, j = valuesToPush.length; i < j; i++)
            array.push(valuesToPush[i]);
    return array;
}
ko.utils.addOrRemoveItem(array, value, included)
included为true,则array中含有value不处理,没有则添加; included为false,则array中含有value删除,没有则不处理。 使用方法:
var arr = [1, 2, 3];
ko.utils.addOrRemoveItem(arr, 4, true); /// arr为[1, 2, 3, 4]
// 或者
ko.utils.addOrRemoveItem(arr, 4, false); /// arr为[1, 2, 3]
// 或者
ko.utils.addOrRemoveItem(arr, 2, true); /// arr为[1, 2, 3]
// 或者
ko.utils.addOrRemoveItem(arr, 2, false); /// arr为[1, 3]
ko.utils.addOrRemoveItem源码:
addOrRemoveItem: function(array, value, included) {
    var existingEntryIndex = ko.utils.arrayIndexOf(ko.utils.peekObservable(array), value);
    if (existingEntryIndex < 0) {
        if (included)
            array.push(value);
    } else {
        if (!included)
            array.splice(existingEntryIndex, 1);
    }
}
ko中基本上就这些处理数组的方法了,如果你知道ko中有这些方法,那么在做兼容比较旧的浏览器(IE8及以下)的开发能让你轻松很多。
转自:https://www.xiaoboy.com/topic/ko-utils-array-function.html
Knockout中ko.utils中处理数组的方法集合的更多相关文章
- java script删除数组的方法集合(转载)
		
一.清空数组 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即被清空了 二.删 ...
 - javascript中slice() splice() concat()操作数组的方法
		
这三个操作数组,哪个返回一个新数组呢.上代码 splice()方法,用于插入,删除和替换. var arr=[1,2,3,4,5]; var arr1=arr.splice(1,3); console ...
 - JavaScript中十种一步拷贝数组的方法
		
JavaScript中我们经常会遇到拷贝数组的场景,但是都有哪些方式能够来实现呢,我们不妨来梳理一下. 1.扩展运算符(浅拷贝) 自从ES6出现以来,这已经成为最流行的方法.它是一个很简单的语法,但是 ...
 - js中几种常用的数组处理方法的总结
		
一.filter()用法 功能:用于筛选数组中满足条件的元素,返回一个筛选后的新数组. <script> $(function(){ var arr = [1,-2,3,4,-5]; va ...
 - JS数组遍历方法集合
		
就让我们在逆战中成长吧,加油武汉,加油自己 1.for循环 使用零时变量将长度存起来,当数组较大时优化效果才会比较明显. var ar1=[2,4,6,8] for(var i=0;i<ar1. ...
 - js数组去重方法集合
		
//第一种方法,新建一个空数组,将原来的数组循环逐个与新数组的成员做比较,如果新数组没有该元素就push进来 var arr = ['a', 1, 1, 1, 2, 4, 4, 'b', 'c', ' ...
 - 一些ES5的操作数组的方法
		
在ES5规范中新增了不少操作数组的方法,特此罗列一下以备使用 1. forEach循环 有点类似jQuery的each循环 [12,23,36,4,5].forEach(function(v,k){ ...
 - 掌握javascript中的最基础数据结构-----数组
		
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
 - 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了
		
地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图
 
随机推荐
- Android——分割线中夹文字
			
内容不多,只是感觉平时很容易遇上,那就做个笔记吧! 其实很简单,如下: <RelativeLayout android:layout_width="match_parent" ...
 - Python之路1-变量、数据类型、循环语法
			
1.python语言介绍 编程语言主要从以下几个角度进行分类,编译型和解释型,静态语言和动态语言,强类型定义语言和弱类型定义语言. 编译和解释区别 编译器是把源程序的每一条语句都编译成机器语言,并保存 ...
 - 2.2 collection 模块
			
2.2.1 定义命名元祖 2.2.2 定义双端队列 2.2.3 定义有序的字典 2.2.4 定义有默认值的字典
 - Codeforces 629D Babaei and Birthday Cakes DP+线段树
			
题目:http://codeforces.com/contest/629/problem/D 题意:有n个蛋糕要叠起来,能叠起来的条件是蛋糕的下标比前面的大并且体积也比前面的大,问能叠成的最大体积 思 ...
 - OpenFlow 交换机与控制器交互步骤
			
1. Hello 控制器与交互及互相发送 Hello 消息.Hello消息中只包含有OpenFlow Header,其中的 type 字段为 OFPT_HELLO,version 字段为发送方所支持的 ...
 - JMeter5.1开发TCP协议接口脚本
			
最简单的方法,就是找开发给报文,直接复制到tcp取样器中,将需要变化的值做参数化就可以了.(xml报文要去掉回车换行) 下面是一个通讯头定义 通讯头56个字节(1个字符一个字节) 3 + 9 + 9 ...
 - Redmine简易安装与系统优化
			
安装版本为bitnami-redmine-2.6.5-0 ,用的Bitnami的一键安装包 . 下载地址https://bitnami.com/stack/redmine/installer 简要安装 ...
 - 为什么要使用50ohm阻抗?
			
对于接收机我们期望同轴线的损耗越低越好 对于发射机同轴线的功率效率则是越大越好 所以在二者性能最优时阻抗并不相等 https://www.sohu.com/a/109536765_335274
 - 洛谷P1108 低价购买题解
			
看到"你必须用低于你上次购买它的价格购买它",有没有想到什么?没错,又是LIS,倒过来的LIS,所以我们只要把读入的序列倒过来就可以求LIS了,第一问解决. 首先要厘清的是,对于这 ...
 - Java反射、反射练习整理
			
反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...