假设这是我的输入:"0.1412898495873448 -0.03307049805768848 -0.0002348551519150674 0.0007142371877833145 -0.01250041632738383 0.4052674201000387 -0.02541421100956797 -0.02842612870208528 1803.701163338969 1796.443677744862 1986.31441429052 1442.354524622483"
西尔维斯特有this个构造函数。它需要一个嵌套数组。
使用String.split()
和map
以及朋友将字符串转换为数字数组非常简单。
与此不同的是:
var nums = line.split(/ |\n/);
nums.map(function(num) {return parseFloat(num);});
但我认为Javascript缺少一个功能风格的功能,可以将我的16个数组“分组”成4行4个数字。
我想也许像underscore这样的JS实用程序库可能会让我受到影响。
看起来不像。
最优雅和/或最有效的方法是什么?我 使用for循环吗?
function nest(array, range) {
var l = array.length;
var ret = [];
var cur = null;
for (var i=0; i<l; ++i) {
if (!(i%range)) {
cur = [];
ret.push(cur);
}
cur.push(array[i]);
}
return ret;
}
节点告诉我这个有效:
> function nest(array, range) {
... var l = array.length;
... var ret = [];
... var cur = null;
... for (var i=0; i<l; ++i) {
..... if (!(i%range)) {
....... cur = [];
....... ret.push(cur);
....... }
..... cur.push(array[i]);
..... }
... return ret;
... }
undefined
> nest([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],4)
[ [ 0, 1, 2, 3 ],
[ 4, 5, 6, 7 ],
[ 8, 9, 10, 11 ],
[ 12, 13, 14, 15 ] ]
>
有人能想出更好的方法吗?
答案 0 :(得分:2)
有几种方法可以将数组拆分为子数组
var line = "0.1412898495873448 -0.03307049805768848 -0.0002348551519150674 0.0007142371877833145 -0.01250041632738383 0.4052674201000387 -0.02541421100956797 -0.02842612870208528 1803.701163338969 1796.443677744862 1986.31441429052 1442.354524622483";
var nums = line.split(/ |\n/).map(parseFloat);
var columns = 4;
var nested = [];
for (var i=0; i < nums.length; i+=columns) {
nested.push(nums.slice(i, i+columns));
}
console.log(nested);
或功能方式:
var nested = Array.apply(null, new Array((nums.length/columns)|0))
.map(function(item, index) {
return nums.slice(index*columns, (index+1) * columns);
});
使用splice而不是slice似乎要好得多,尽管可能是由于写得不好tests
var columns = 4;
var nested = [];
for (var i=nums.length/columns; i--;) { // gives expected result if columns===0
nested.push(nums.splice(0,columns));
}
可替换地:
var columns = 4;
var nested = [];
while(nums.length) nested.push(nums.splice(0,columns));
答案 1 :(得分:0)
这是我的方法,
var nums = line.split(/ |\n/);
var temp=[],output=[],i=0;
while(i<nums.length){
temp.push(i);
if(i%4 == 0){
output.push(temp);
temp=[];
}
i++
}
console.dir(output);
对于我的感官,这是非常快的! 根据接受的答案检查此性能测试 http://jsperf.com/comparing-use-of-modulo-vs-slice-in-a-special-case