快捷搜索:
来自 新京葡娱乐场网址 2019-06-17 11:54 的文章
当前位置: 67677新澳门手机版 > 新京葡娱乐场网址 > 正文

【新京葡娱乐场网址】js将类数组对象转换成数组

优雅的数组降维——Javascript中apply方法的妙用

2016/02/18 · JavaScript · apply, 数组

初稿出处: ralph_zhu   

将多维数组(特别是二维数组)转化为一维数组是事情费用中的常用逻辑,除了使用节约财富的循环调换以外,大家还足以行使Javascript的言语特色达成越发轻易优雅的转换。本文将从节俭的巡回调换开端,逐一介绍三种常用的调换方法,并借此轻易回想Array.prototype.concat方法和Function.prototype.apply方法。
以下代码将以把二维数组降维到一维数组为例。

  1. 仔细的转移

JavaScript

function reduceDimension(arr) { var reduced = []; for (var i = 0; i < arr.length; i ) { for (var j = 0; j < arr[i].length; j ) { reduced.push(arr[i][j]); } } return reduced; }

1
2
3
4
5
6
7
8
9
function reduceDimension(arr) {
    var reduced = [];
    for (var i = 0; i < arr.length; i ) {
        for (var j = 0; j < arr[i].length; j ) {
            reduced.push(arr[i][j]);
        }
    }
    return reduced;
}

此办法思路轻松,利用再度循环遍历二维数组中的各类成分并内置新数组中。

 

  1. 利用concat转换
    先来回看一下MDN上对此该措施的介绍:
    “concat creates a new array consisting of the elements in the object on which it is called, followed in order by, for each argument, the elements of that argument (if the argument is an array) or the argument itself (if the argument is not an array).”

即只要concat方法的参数是一个要素,该因素会被直接插入到新数组中;假设参数是二个数组,该数组的逐一要素将被插入到新数组中;将该本性应用到代码中:

JavaScript

function reduceDimension(arr) { var reduced = []; for (var i = 0; i < arr.length; i ){ reduced = reduced.concat(arr[i]); } return reduced; }

1
2
3
4
5
6
7
function reduceDimension(arr) {
    var reduced = [];
    for (var i = 0; i < arr.length; i ){
        reduced = reduced.concat(arr[i]);
    }
    return reduced;
}

arr的每三个成分都是多少个数组,作为concat方法的参数,数组中的每贰个子成分又都会被单独插入进新数组。
动用concat方法,我们将另行循环简化为了单重循环。

 

  1. 利用apply和concat转换
    依照常规,先来回想一下MDN上对于apply方法的介绍:
    “The apply() method calls a function with a given this value and arguments provided as an array.”

即apply方法会调用三个函数,apply方法的率先个参数会作为被调用函数的this值,apply方法的第二个参数(一个数组,或类数组的指标)会作为被调用对象的arguments值,也正是说该数组的相继要素将会挨个成为被调用函数的逐一参数;将该天性应用到代码中:

function reduceDimension(arr) { return Array.prototype.concat.apply([], arr); }

1
2
3
function reduceDimension(arr) {
    return Array.prototype.concat.apply([], arr);
}

arr作为apply方法的第二个参数,自己是三个数组,数组中的每三个要素(如故数组,即二维数组的第二维)会被看作参数依次传入到concat中,效果同样[].concat([1,2], [3,4], [5,6])。
使用apply方法,大家将单重循环优化为了一行代码,很轻便有型有木有啊~

读者也可参照本文思路,本人使用递归完成N维数组降维的逻辑。

3 赞 8 收藏 评论

新京葡娱乐场网址 1

复制代码 代码如下:

var toArray = function(){
return isIE ?
function(a, i, j, res){
res = [];
Ext.each(a, function(v) {
res.push(v);
});
return res.slice(i || 0, j || res.length);
} :
function(a, i, j){
return Array.prototype.slice.call(a, i || 0, j || a.length);
}
}()

[Ctrl A 全选 注:如需引进外部Js需刷新技能实践]

Ext的安顿比较玄妙,功用也正如强硬。它一初始就活动实行自个儿,以后就不用剖断浏览器了。它还大概有五个可选参数,对转移的纯数组举行操作。
最后看dojo的_toArray,dojo的兑现一而再那么离奇的。 和Ext同样,后边八个参数是可选,只可是第二个是偏移量,最终贰个是已有的数组,用于把新生的新组成分合并过去。

//jQuery的makeArray
var makeArray = function( array ) {
var ret = [];
if( array != null ){
var i = array.length;
// The window, strings (and functions) also have 'length'
if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
ret[0] = array;
else
while( i )
ret[--i] = array[i];
}
return ret;
}

function $A(iterable) {
if (!iterable) return [];
if (iterable.toArray) return iterable.toArray();
var length = iterable.length || 0, results = new Array(length);
while (length--) results[length] = iterable[length];
return results;
}

jQuery对象是用来存款和储蓄与管理dom元素的,它最首要依据于setArray方法来安装与有限协助长度与索引,而setArray的参数要求是贰个数组,由此makeArray的地位十三分重要。那办法保险纵然未有参数也要赶回三个空数组。
Prototype.js的$A方法

复制代码 代码如下:

复制代码 代码如下:

本文由67677新澳门手机版发布于新京葡娱乐场网址,转载请注明出处:【新京葡娱乐场网址】js将类数组对象转换成数组

关键词: