定义数组“分组”效用函数的优雅方法是什么?

时间:2014-01-24 23:00:11

标签: javascript

假设这是我的输入:"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 ] ]
>

有人能想出更好的方法吗?

2 个答案:

答案 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