在 javascript 中展平 multi-level/nested 数组
Flatten multi-level/nested array in javascript
我正在尝试了解这段代码如何展平多 levels/nested 数组
谁能帮忙详细说说?谢谢
var flatten = function(a, shallow,r){
if(!r){ r = []} //what does the exclamation mark mean here?...
if (shallow) {
return r.concat.apply(r,a); //I can't find what's .apply for concat method
}
for(var i=0; i<a.length; i++){
if(a[i].constructor == Array){
flatten(a[i],shallow,r);
}else{
r.push(a[i]);
}
}
return r;
}
alert(flatten([1, [2], [3, [[4]]],[5,6]]));
!r
是 "Not r" 中的否定。这意味着如果 r=false、r=null 或 r=undefined,则 if 状态为真。
.apply()
是 javascript 中所有函数的成员。它允许您使用与其所在函数不同的 "this" 范围调用该函数。检查一下:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
有趣的是,示例中没有达到代码的浅层部分。
更新
我觉得函数很难理解。这是一个可能更容易阅读的替代方法。
function flatten(arr) {
var flatArray = [];
function pushLoop(a) {
var len = a.length;
var i=0;
for (i; i < len; i++) {
if (a[i] && a[i].constructor == Array) {
pushLoop(a[i]);
} else {
flatArray.push(a[i]);
}
}
}
pushLoop(arr);
return flatArray;
}
原始片段
var flatten = function(a, shallow, r) {
// if r does not exist create.
if (!r) {
r = []
}
// if shallow exists concat the arrays
if (shallow) {
// concat joins two or more arrays as paramenters.
// The prototype apply allows us to define the parameters
// as an array. Esentially concat the arrays in array a.
return r.concat.apply(r, a);
}
for (var i = 0; i < a.length; i++) {
// Only flatten items that are arrays and push everything
// else to the end.
if (a[i].constructor == Array) {
flatten(a[i], shallow, r);
} else {
r.push(a[i]);
}
}
return r;
}
var output = document.getElementById("output");
var arr = (flatten([1, [2],
[3, [
[4]
]],
[5, 6]
]));
output.innerHTML = JSON.stringify(arr);
<div id="output"></div>
关于申请
行 return r.concat.apply(r,a) 具有误导性。
他们也可以使用 [].concat.apply(r,a)。
'apply' 是在每个类型为 'function' 的对象(typeof o === 'function',本质上是任何可调用对象)上定义的方法,它执行绑定到第一个 'this' 的函数参数和数组中的参数作为第二个参数传递。
假设我们有一个函数'f'。
function f(a,b,c) {
this.x = a + b + c;
}
这两个代码块都调用了f where this === objInstance 并且两个块之后都是运行, objInstance.x = 6.
var Obj = function() {};
Obj.prototype.f = f;
var objInstance = new Obj();
objInstance.f(1,2,3);
var Obj = function () {};
var objInstance = new Obj();
f.apply(objInstance, [1,2,3]);
所以 [].concat.apply(r,a) 等价于 [].concat 应用参数 a 在对象 r 上。它将 a 中的每个数组连接到数组 r.
我正在尝试了解这段代码如何展平多 levels/nested 数组
谁能帮忙详细说说?谢谢
var flatten = function(a, shallow,r){
if(!r){ r = []} //what does the exclamation mark mean here?...
if (shallow) {
return r.concat.apply(r,a); //I can't find what's .apply for concat method
}
for(var i=0; i<a.length; i++){
if(a[i].constructor == Array){
flatten(a[i],shallow,r);
}else{
r.push(a[i]);
}
}
return r;
}
alert(flatten([1, [2], [3, [[4]]],[5,6]]));
!r
是 "Not r" 中的否定。这意味着如果 r=false、r=null 或 r=undefined,则 if 状态为真。
.apply()
是 javascript 中所有函数的成员。它允许您使用与其所在函数不同的 "this" 范围调用该函数。检查一下:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
有趣的是,示例中没有达到代码的浅层部分。
更新
我觉得函数很难理解。这是一个可能更容易阅读的替代方法。
function flatten(arr) {
var flatArray = [];
function pushLoop(a) {
var len = a.length;
var i=0;
for (i; i < len; i++) {
if (a[i] && a[i].constructor == Array) {
pushLoop(a[i]);
} else {
flatArray.push(a[i]);
}
}
}
pushLoop(arr);
return flatArray;
}
原始片段
var flatten = function(a, shallow, r) {
// if r does not exist create.
if (!r) {
r = []
}
// if shallow exists concat the arrays
if (shallow) {
// concat joins two or more arrays as paramenters.
// The prototype apply allows us to define the parameters
// as an array. Esentially concat the arrays in array a.
return r.concat.apply(r, a);
}
for (var i = 0; i < a.length; i++) {
// Only flatten items that are arrays and push everything
// else to the end.
if (a[i].constructor == Array) {
flatten(a[i], shallow, r);
} else {
r.push(a[i]);
}
}
return r;
}
var output = document.getElementById("output");
var arr = (flatten([1, [2],
[3, [
[4]
]],
[5, 6]
]));
output.innerHTML = JSON.stringify(arr);
<div id="output"></div>
关于申请
行 return r.concat.apply(r,a) 具有误导性。
他们也可以使用 [].concat.apply(r,a)。 'apply' 是在每个类型为 'function' 的对象(typeof o === 'function',本质上是任何可调用对象)上定义的方法,它执行绑定到第一个 'this' 的函数参数和数组中的参数作为第二个参数传递。
假设我们有一个函数'f'。
function f(a,b,c) {
this.x = a + b + c;
}
这两个代码块都调用了f where this === objInstance 并且两个块之后都是运行, objInstance.x = 6.
var Obj = function() {};
Obj.prototype.f = f;
var objInstance = new Obj();
objInstance.f(1,2,3);
var Obj = function () {};
var objInstance = new Obj();
f.apply(objInstance, [1,2,3]);
所以 [].concat.apply(r,a) 等价于 [].concat 应用参数 a 在对象 r 上。它将 a 中的每个数组连接到数组 r.