我想展平用户提交的嵌套数组。
这就是它的工作方式: 用户输入输入:[[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>
如何让这个脚本运行?不知道如何将正确的输入数据放入数组中。
答案 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)
只需尝试split
和join
即可获得连续数组
[[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;
};
这只会遇到数组的顶层,并检查它是否包含子数组。如果是这样,它会将它们拼接出原件,并将它的孩子推入它的位置。数组可以无穷无尽,但不会找到嵌套在对象中的数组。