获取数组javascript的子数组

获取数组javascript的子数组,javascript,arrays,Javascript,Arrays,我在javascript中有一个数组,我想要一个数组的子数组,数组中的元素位于位置n*3,n=0,1,2。。例如,如果: var arr = [1,2,3,4,5,6,7,8,9,10,11,12] var subArr = [1,4,7,10] 编辑:没有循环的任何soln。下面是一个奇特方式的示例: var brr = [1,2,3,4,5,6,7,8,9,10,11,12].filter(function(_,i){ return !(i%3) }) 但是一个简单的循环也同样好(并且

我在javascript中有一个数组,我想要一个数组的子数组,数组中的元素位于位置n*3,n=0,1,2。。例如,如果:

var arr = [1,2,3,4,5,6,7,8,9,10,11,12]

var subArr = [1,4,7,10]

编辑:没有循环的任何soln。

下面是一个奇特方式的示例:

var brr = [1,2,3,4,5,6,7,8,9,10,11,12].filter(function(_,i){ return !(i%3) })
但是一个简单的循环也同样好(并且与IE8兼容)。请注意,
过滤器
,即使它不可见,也会在阵列上循环。即使可以伪装,也无法避免循环(至少对于任意大小的数组)


下面是使用标准循环的方法:

var brr = [];
for (var i=0; i<arr.length; i+=3) brr.push(arr[i])
var brr=[];

对于(var i=0;i

以下是一个奇特方式的示例:

var brr = [1,2,3,4,5,6,7,8,9,10,11,12].filter(function(_,i){ return !(i%3) })
但是一个简单的循环也一样好(并且与IE8兼容)。请注意,
过滤器
,即使它不可见,也会在数组上循环。即使你可以伪装它,也无法避免循环(至少对于任意大小的数组)


下面是使用标准循环的方法:

var brr = [];
for (var i=0; i<arr.length; i+=3) brr.push(arr[i])
var brr=[];

对于(var i=0;i

为了对一组大小为n,m次的数据进行操作,其中m>1,您将如何避免迭代?实际上,除非您使用一组O(1)操作,否则没有办法:

var arr = [1,2,3,4,5,6,7,8,9,10,11,12];
var subarr = [];
subarr.push(arr[0]);
subarr.push(arr[3]);
subarr.push(arr[6]);
subarr.push(arr[9]);
这里是一个结构递归(它可以用循环表示,并且从技术上讲是循环的)


注意:直接for循环总是更快。在@dystroy的jsperf的扩展中,这个递归比for循环运行得慢,但比过滤器运行得快。

为了对一组大小为n,m次的数据进行操作,其中m>1,您如何避免迭代?真的,除非使用一组O(1),否则没有办法像这样的操作:

var arr = [1,2,3,4,5,6,7,8,9,10,11,12];
var subarr = [];
subarr.push(arr[0]);
subarr.push(arr[3]);
subarr.push(arr[6]);
subarr.push(arr[9]);
这里是一个结构递归(它可以用循环表示,并且从技术上讲是循环的)


注意:直接的for循环总是更快。在@dystroy的jsperf的扩展中,这个递归比for循环运行得慢,但比过滤器运行得快。

仅仅是为了提高效率,我寻找了一种不使用OP所需的循环的方法。 如果不使用循环,这很难。 我能做到的最接近的方法是获得正确的数字,但将它们转换为字符串而不是数字

var r=[1,2,3,4,5,6,7,8,9,10,11,12,13,14];
alert(   "".replace.call(r+",-0,-0,-0", /(\d+),\d+,?(\d+,|$)/g, "$1,")
           .replace(/(,?\-0){1,4}$/g,"")
           .split(",")    ); 
 //shows: 1,4,7,10,13
如果您需要强数字,这很容易,但我不确定在.split(“,”)之后添加.map(Number)是否会在您的书中构成一个循环,但这是唯一一个在没有循环的情况下实际找到所需结果的版本

这也只适用于编码的正整数


再一次,我推荐使用的不仅仅是好玩的东西;不要害怕循环…

仅仅是为了好玩,我寻找了一种方法,在没有像OP想要的那样的循环的情况下真正做到这一点。 如果不使用循环,这很难。 我能做到的最接近的方法是获得正确的数字,但将它们转换为字符串而不是数字

var r=[1,2,3,4,5,6,7,8,9,10,11,12,13,14];
alert(   "".replace.call(r+",-0,-0,-0", /(\d+),\d+,?(\d+,|$)/g, "$1,")
           .replace(/(,?\-0){1,4}$/g,"")
           .split(",")    ); 
 //shows: 1,4,7,10,13
如果您需要强数字,这很容易,但我不确定在.split(“,”)之后添加.map(Number)是否会在您的书中构成一个循环,但这是唯一一个在没有循环的情况下实际找到所需结果的版本

这也只适用于编码的正整数


再次强调,这比我推荐使用的更有趣;不要害怕循环…

这里有一个没有循环的解决方案:

var arr = [1,2,3,4,5,6,7,8,9,10,11,12];
// pickInterval is a function that automatically picks every "n"
// elements from an array, starting with the first element
var subArr = pickInterval( arr, 3 );
// now subArr is [1,4,7,10]
很简单,不是吗?而且看不到一个环

啊,但是你会问,“有什么问题吗?你还没有实现
pickInterval()
函数,是吗?我打赌它有一个循环。”

你是对的。即使我们使用其他看起来不像循环的函数编写
pickInterval()
函数,该函数中也会有一个循环。如果该函数只调用另一个函数,最终你会找到一个循环

可能一路上都是海龟,但它们下面都有一个环

因此,为了实现
pickInterval()
,我们可以使用@dystroy的答案中的任何一种方法。我们可以将循环放在函数内部:

function pickInterval( array, interval ) {
    var result = [];
    for( var i = 0, n = array.length;  i < n;  i += 3 )
        result.push( array[i] );
    return result;
}
当然这里仍然有一个循环,在
.filter()
内部。它被隐藏起来,就像
pickInterval()
对调用方隐藏任何循环一样

这才是真正的要点。使用
.filter()
,使用
for
循环,使用任何你想要的,只要你把它封装在一个函数中。那么这个函数的内部工作就不那么重要了。如果你喜欢
for
循环,因为它快速且易于理解,那么就使用它。如果你喜欢
filter()
version因为它有趣且优雅,所以请使用它。如果以后需要在非常大的阵列上使用它,并且运行速度很慢,则可以将其替换为
for
循环版本,而不会影响使用
pickInterval()的代码。


无论您为此或类似的内容编写什么代码,都不要将其内联。创建一个函数。

这里有一个没有循环的解决方案:

var arr = [1,2,3,4,5,6,7,8,9,10,11,12];
// pickInterval is a function that automatically picks every "n"
// elements from an array, starting with the first element
var subArr = pickInterval( arr, 3 );
// now subArr is [1,4,7,10]
很简单,不是吗?而且看不到一个环

啊,但是你会问,“有什么问题吗?你还没有实现
pickInterval()
函数,是吗?我打赌它有一个循环。”

你是对的。即使我们使用其他看起来不像循环的函数编写
pickInterval()
函数,该函数中也会有一个循环。如果该函数只调用另一个函数,最终你会找到一个循环

可能一路上都是海龟,但它们下面都有一个环

因此,为了实现
pickInterval()
,我们可以使用@dystroy的答案中的任何一种方法。我们可以将循环放在函数内部:

function pickInterval( array, interval ) {
    var result = [];
    for( var i = 0, n = array.length;  i < n;  i += 3 )
        result.push( array[i] );
    return result;
}
当然这里仍然有一个循环,在
.filter()
内部。它被隐藏起来,就像
pickInterval()
对调用方隐藏任何循环一样

这才是真正的重点。使用
.filter()
,使用
for
循环,使用任何你想要的,只要你把它封装在一个函数中。那么这个函数的内部工作就没那么重要了。如果你喜欢
for