从输入中展平嵌套数组

时间:2016-01-25 18:13:36

标签: javascript arrays

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

这就是它的工作方式: 用户输入输入:[[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>

如何让这个脚本运行?不知道如何将正确的输入数据放入数组中。

5 个答案:

答案 0 :(得分: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 :(得分:1)

只需尝试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]]

答案 2 :(得分:0)

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

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

两者都返回平面阵列。

答案 3 :(得分:-1)

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

答案 4 :(得分:-1)

gurvinder372的答案是一个漂亮,快速和肮脏的方法,可以在一些非常深度嵌套的数组上工作。只是想补充一点,这种方法会将数字转换成字符串。要将它们返回到数字形式,请在末尾添加地图方法。

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

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