【问题标题】:How to flatten array in jQuery?如何在jQuery中展平数组?
【发布时间】:2011-12-14 01:47:45
【问题描述】:

如何在 jQuery 中简单地展平数组?我有:

[1, 2, [3, 4], [5, 6], 7]

我想要:

[1, 2, 3, 4, 5, 6, 7]

【问题讨论】:

    标签: javascript jquery arrays flatten


    【解决方案1】:

    您可以使用jQuery.map,如果您已经加载了 jQuery 库,则可以使用此方法。

    $.map( [1, 2, [3, 4], [5, 6], 7], function(n){
       return n;
    });
    

    返回

    [1, 2, 3, 4, 5, 6, 7]
    

    【讨论】:

    • 当然,这就是问题中的措辞方式,但是,这也只会变平一层。
    • 对于那些想知道它是如何工作的人:不像Array.prototype.map jQuery 的map 对从回调函数返回的数组有特殊处理:[callback] 函数可以返回任何值。返回的数组将被展平为结果数组
    【解决方案2】:

    你可以使用jQuery.map():

    callback(value, indexOrKey)处理每一项的函数 反对。函数的第一个参数是值;第二 参数是数组或对象属性的索引或键。这 函数可以返回任何值以添加到数组中。 返回的数组 将被展平为结果数组。在函数内,这 指的是全局(窗口)对象。

    【讨论】:

      【解决方案3】:
      var a = [1, 2, [3, 4], [5, [6, [7, 8]]]];
      var b = [];
      
      function flatten(e,b){
          if(typeof e.length != "undefined")
          {
              for (var i=0;i<e.length;i++)
              {
                  flatten(e[i],b);
              }
          }
          else
          {
              b.push(e);
          }
      }
      flatten(a,b);
      console.log(b);
      

      flatten 函数应该可以做到,这不需要 jQuery。只需将所有这些复制到 Firebug 中并运行它。

      【讨论】:

      • 我应该补充一点,这不仅会展平数组,还会展平任何具有“长度”方法的东西。除非将其声明为 new Array(),否则实际上无法在 Javascript 中确定某个东西是真正的数组。
      • dnuttle:实际上,我认为使用obj instanceof Array 几乎可以正常工作。 (除非有另一个名为 Array 的变量,那么你可以使用obj instanceof [].constructor
      • 嗯。你说得对。我可以发誓我之前尝试过,但没有成功。
      • dnuttle:这个答案讨论了它:stackoverflow.com/questions/1058427/…我的方法似乎有问题:(
      • 你总是可以使用$.isArray。纯 js 很棒,但库也很好 =]。
      【解决方案4】:

      使用 JavaScript 的强大功能:

      var a = [[1, 2], 3, [4, 5]];
      
      console.log( Array.prototype.concat.apply([], a) );
      //will output [1, 2, 3, 4, 5]
      

      【讨论】:

      • 如果您只有嵌套一层深的数组,这将有效。如果你在一个数组中有一个数组,它不会被展平。
      • @dnuttle 当然可以,但是问题中没有说明这种情况。
      • 你能解释一下apply([], a)位吗? :)
      【解决方案5】:

      以下是使用 jquery 扁平化深度嵌套数组的方法:

      $.map([1, 2, [3, 4], [5, [6, [7, 8]]]], function recurs(n) {
          return ($.isArray(n) ? $.map(n, recurs): n);
      });
      

      返回:

      [1, 2, 3, 4, 5, 6, 7, 8]
      

      利用jQuery.mapjQuery.isArray

      【讨论】:

        【解决方案6】:

        老问题,我知道,但是...

        我发现这是可行的,而且速度很快:

        function flatten (arr) {
          b = Array.prototype.concat.apply([], arr);
          if (b.length != arr.length) {
            b = flatten(b);
          };
        
          return b;
        }
        

        【讨论】:

          【解决方案7】:

          要递归地展平数组,您可以使用本机 Array.reduce 函数。没有必要为此使用jQuery。

          function flatten(arr) {
              return arr.reduce(function flatten(res, a) { 
                  Array.isArray(a) ? a.reduce(flatten, res) : res.push(a);
                  return res;
              }, []);
          }
          

          执行

          flatten([1, 2, [3, 4, [5, 6]]])
          

          返回

          [ 1, 2, 3, 4, 5, 6 ]
          

          【讨论】:

          • 很高兴它可以工作,但仅适用于现代浏览器(除非已填充)
          【解决方案8】:

          如果您有多个级别,请使用递归:

          flaten = function(flatened, arr) {
              for(var i=0;i<arr.length;i++) {
                  if (typeof arr[i]!="object") {
                      flatened.push(arr[i]);
                  }
                  else {
                      flaten(flatened,arr[i]);
                  }
              }
              return;
          }
          
          a=[1,[4,2],[2,7,[6,4]],3];
          b=[];
          flaten(b,a);
          console.log(b);
          

          【讨论】:

            【解决方案9】:

            您可以使用Array.prototype.reduce,这在技术上不是 jQuery,而是有效的 ES5:

            var multidimensionArray = [1, 2, [3, 4], [5, 6], 7];
            var initialValue = [];
            
            var flattened = multidimensionArray.reduce(function(accumulator, current) {
                return accumulator.concat(current);
            }, initialValue);
            
            console.log(flattened);
            

            【讨论】:

              【解决方案10】:

              你需要arr.flat([depth])

              var arr1 = [1, 2, [3, 4]];
              arr1.flat(); 
              // [1, 2, 3, 4]
              
              var arr2 = [1, 2, [3, 4, [5, 6]]];
              arr2.flat();
              // [1, 2, 3, 4, [5, 6]]
              
              var arr3 = [1, 2, [3, 4, [5, 6]]];
              arr3.flat(2);
              // [1, 2, 3, 4, 5, 6]
              

              【讨论】:

                猜你喜欢
                • 2014-05-21
                • 2019-11-16
                • 2017-01-14
                • 1970-01-01
                • 2021-12-21
                • 1970-01-01
                • 1970-01-01
                • 2016-09-10
                • 1970-01-01
                相关资源
                最近更新 更多