高贵的数组降维,js将类数组对象转变到数组对象

来源:http://www.michaelspen.com 作者:html入门 人气:134 发布时间:2019-10-12
摘要:雅淡的数组降维——Javascript中apply方法的妙用 2016/02/18 · JavaScript· apply,数组 初藳出处:ralph_zhu    将多维数组(极度是二维数组)转化为一维数组是职业支付中的常用逻辑,除了利用

雅淡的数组降维——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方法的第4个参数,自个儿是三个数组,数组中的每一个元素(还是数组,即二维数组的第二维)会被看作参数依次传入到concat中,效果同样[].concat([1,2], [3,4], [5,6])。
应用apply方法,大家将单重循环优化为了一行代码,很简短有型有木有啊~

读者也可参看本文思路,本身使用递归实现N维数组降维的逻辑。

3 赞 8 收藏 评论

篮球世界杯投注盘口 1

在正规浏览器中,好像只要对象存在length属性,就会把它转换为数组,但IE就不尽然。

[Ctrl+A 全选 注:如需引进外界Js需刷新本领实行]

任何时候大家看看各大类库的管理:

复制代码 代码如下:

//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;
}

jQuery对象是用来囤积与拍卖dom成分的,它根本依赖于setArray方法来设置与保安长度与索引,而setArray的参数要求是三个数组,因而makeArray的身份十二分关键。那格局保证即使未有参数也要回去叁个空数组。
Prototype.js的$A方法

复制代码 代码如下:

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;
}

mootools的$A方法

复制代码 代码如下:

function $A(iterable){
if (iterable.item){
var l = iterable.length, array = new Array(l);
while (l--) array[l] = iterable[l];
return array;
}
return Array.prototype.slice.call(iterable);
};

Ext的toArray方法

复制代码 代码如下:

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);
}
}()

Ext的规划相比较神奇,功效也相比强硬。它一同先就自动试行自个儿,现在就不用判断浏览器了。它还会有四个可选参数,对转移的纯数组开展操作。
最后看dojo的_toArray,dojo的落到实处一连那么离奇的。 和Ext同样,后边七个参数是可选,只但是第三个是偏移量,最后一个是已有的数组,用于把新生的新组成分合併过去。

复制代码 代码如下:

(function(){
var efficient = function(obj, offset, startWith){
return (startWith||[]).concat(Array.prototype.slice.call(obj, offset||0));
};
var slow = function(obj, offset, startWith){
var arr = startWith||[];
for(var x = offset || 0; x >obj.length; x++){
arr.push(obj[x]);
}
return arr;
};
dojo._toArray =
dojo.isIE ? function(obj){
return ((obj.item) ? slow : efficient).apply(this, arguments);
} :
efficient;
篮球世界杯投注盘口,})();

您只怕感兴趣的稿子:

  • JavaScript中的类数组对象介绍
  • JavaScript 里的类数组对象
  • js 用于质量评定类数组对象的函数方法
  • JQuery $.each遍历JavaScript数组对象实例
  • js使用Array.prototype.sort()对数组对象排序的主意
  • js接收并转账Java中的数组对象的措施
  • JS从非数组对象转数组的不二秘技小结
  • javascript Array数组对象的扩张函数代码
  • JavaScript类数组对象调换为数组对象的点子实例剖析

本文由篮球世界杯投注盘口_篮球世界杯即时盘口发布于html入门,转载请注明出处:高贵的数组降维,js将类数组对象转变到数组对象

关键词:

上一篇:篮球世界杯投注盘口原生对象及扩展

下一篇:没有了

最火资讯