繁体   English   中英

在JavaScript中展平多级/嵌套数组

[英]Flatten multi-level/nested array in javascript

我正在尝试了解此代码段如何使多级/嵌套数组扁平化

有人可以帮忙详细说明吗? 谢谢

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]]));

有趣的是,在示例中未达到代码的较浅部分。

更新

我认为该功能很难遵循。 这是一个可能更容易阅读的替代方法。

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> 

!r是“ Not r”中的否定词。 这意味着如果r = false,r = null或r = undefined,则if状态的含义为true。

.apply()是javascript中所有函数的成员。 它允许您使用与其所在的函数不同的“ this”作用域来调用该函数。签出该代码: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function /应用

关于申请

行返回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 = = objInstance的地方调用f,在两个块都运行之后,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)等同于在对象r上应用了参数a的[] .concat。 它将a中的每个数组连接到数组r。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM