【问题标题】:Flattening Nested Arrays from input从输入展平嵌套数组
【发布时间】:2016-05-02 03:56:08
【问题描述】:

我想扁平化用户提交的嵌套数组。

它应该是这样工作的: 用户输入:[[1],[2],[3, 4],[5],[6, 7]] 他得到一个结果:[1,2,3,4,5,6,7]

它不起作用,因为我可以从输入数据创建一个数组。

$( document ).ready(function() {

//Get input data and make an array of it
var tablica = $('.tablica').val();
var myArray = [ tablica ];



$('input').on('click', function(e) {
e.preventDefault();

 console.log(myArray);
//myArray gives me: ["[[1],[2],[3, 4],[5],[6, 7]]"] instead of [[1],[2],[3, 4],[5],[6, 7]] and that's why script doesnt work..

var flat_arr = [].concat.apply([], myArray);



$('.wynik').html(tablica + ' => ' + flat_arr);


});  

});

HTML:

 <form>
  <input type="text" class="tablica" name="tablica" value="[1],[2],[3, 4],[5],[6, 7]">
  <input type="submit" value="Konwertuj">
</form> 

<p class="wynik"></p>

我怎样才能使这个脚本工作?不知道如何正确地将输入数据放入数组中。

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    您的输入不是数组,而是字符串。你不能把这个字符串变量放在一个数组中并期望魔法发生,但是你可以:

    function strToFlatArray(s) {
      return s.replace(/[[\]\s]/g, '').split(',');
    }
    
    
    document.write(strToFlatArray('[1],[2],[3, 4],[5],[6, 7]'));

    或者如果你知道你会得到数字,你也可以这样做:

    function strToFlatArray(s) {
      return s.match(/\d+/g);
    }
    
    
    document.write(strToFlatArray('[1],[2],[3, 4],[5],[6, 7]'));

    两者都返回平面数组。

    【讨论】:

      【解决方案2】:

      我会使用JSON.parse 然后concat 像这样:

      $( document ).ready(function() {
      
        //Get input data and make an array of it
        var tablica = $('.tablica').val();
        var temp = JSON.parse('['+tablica+']');
        var myArray=[].concat.apply([], temp);
      
        $('input').on('click', function(e) {
          e.preventDefault();
      
          console.log(myArray);
      
          $('.wynik').html(tablica + ' => ' + JSON.stringify(myArray));
      
        });  
      
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
      <form>
        <input type="text" class="tablica" name="tablica" value="[1],[2],[3, 4],[5],[6, 7]">
        <input type="submit" value="Konwertuj">
      </form> 
      
      <p class="wynik"></p>

      【讨论】:

      • 是的,它正在工作,但我想在数组中得到输出:[1,2,3,4,5,6,7]。我怎样才能正确地做到这一点?我试过var flattered = [ flat_arr ],但结果仍然显示,就像它不是一个数组一样。像这样显示:"[" + flat_arr + "]" 这不是最好的主意,因为它是假数组..
      • myArray 是一个数组,要将其作为数组打印到屏幕上,您需要使用 '['+flat_arr+']'JSON.stringify(myArray) 之类的东西,但请再次记住 var myArray 是仍然是一个数组
      【解决方案3】:

      gurvinder372 的答案是一种不错、快速且肮脏的方法,适用于一些非常深嵌套的数组。只是想补充一点,这种方法会将数字转换为字符串。要将它们恢复为数字形式,请在末尾添加一个 map 方法。

      [[1],[2],[3, 4],[5],[6, 7]].join(",").split(",").map(x => Number(x));
      // You could also just wrap 'x' in parens and force js to evaluate it.
      // This saves you from writing that pesky Number constructor
      

      另一种更全面的方法是递归

      function collapse(array) {
        array.forEach(function(el, i) {
          if (Array.isArray(el)) {
            array.splice(i, 1);
            el.forEach(function(x) {
              array.push(x);
            });
            return collapse(array);
          }
        });
        return array;
      };
      

      这只会命中数组的顶层,并检查它是否包含子数组。如果是这样,它将它们从原件中拼接出来,并将其子项推入它的位置。数组可以无限深,但找不到嵌套在对象中的数组。

      【讨论】:

        【解决方案4】:

        问题是tablica 不是一个数组。它是一个字符串。在操作之前调用JSON.parse(tablica) 将其转换为数组。

        【讨论】:

          【解决方案5】:

          只需尝试splitjoin 即可获得串联数组

          [[1],[2],[3, 4],[5],[6, 7]].join(",").split(","); //output [1,2,3,4,5,6,7]
          

          //myArray 给我: ["[[1],[2],[3, 4],[5],[6, 7]]"] 而不是 [[1],[2],[3, 4],[5],[6, 7]] 这就是脚本不起作用的原因..

          你需要做的

          var tablica = "[" + $('.tablica').val() + "]";
          var myArray = JSON.parse( tablica ); //output [[1],[2],[3, 4],[5],[6, 7]]
          

          【讨论】:

          • @StephenTG 是的,在投反对票之前尝试一下!
          • 这很整洁,但不是 Michal 要求的? split 和 join 将始终将其变成 1 个包含所有值的数组
          猜你喜欢
          • 1970-01-01
          • 2021-05-14
          • 2014-05-28
          • 2012-10-31
          • 2017-03-06
          • 2017-07-20
          • 2017-12-26
          • 2019-03-05
          • 1970-01-01
          相关资源
          最近更新 更多