[英]Get n number of consecutive elements of an array
给定一个数组和一个(变量)整数n,我想创建一个包含n个连续元素的新数组。 如果n = 2,我有它,但我不知道如何启用变量n:
var arr = ["first", "second", "third", "fourth", "fifth", "sixth" ];
var int = 3;
function consecEls(array, int) {
newArr = arr.map(function(val, ix, arr) {
var next = ix+1; // this works if I only needed firstsecond, secondthird, etc. but I need arbitrary # of consecutive els
// var next = ... ? ... next n els
var els = arr.slice(arr[ix], int); // or slice(ix, int) ... both return ["first", "second", "third"]
if (next !== arr.length) {
return val + arr[next];
}
else { return val; }
}) // forEach
return newArr;
}
consecEls(arr, int);
非常感谢任何见识,
================================================
正如我在下面的评论中提到的,这是我对@gyre解决方案的稍加修改的版本:
var arr = ["first", "second", "third", "fourth", "fifth", "sixth" ];
function map(array, groupSize, callback, context) {
var i = 0;
var result = [];
while (i < array.length) {
result.push(
callback.call(context, array.slice(i, i + groupSize), i, array)
)
i ++
}
return result
}
map(arr, 2, function (e) {
return e.join("")
})
================================================
好的,再进行一次快速编辑:我作了进一步的调整,以消除回调:
function map(array, groupSize) {
var i = 0;
var result = [];
while (i < array.length) {
result.push(array.slice(i, i + groupSize).join(""))
i ++
}
return result
}
map(array, n);
编辑: @torazaburo的想法实际上是比我最初拥有的功能更好的关注点分离。 我没有意识到将数组分成固定长度的组的过程的名字。 但是,这是我对partition
函数的替代实现,因为我认为它可能更简洁一些,并包括一个可选的offset
参数,以允许跳过前几个元素:
function partition (array, size, offset) { offset |= 0 var result = [] while (offset < array.length) { result.push(array.slice(offset, offset += size)) } return result } var arr = ["first", "second", "third", "fourth", "fifth", "sixth" ], example // Groups of three, joined by spaces example = partition(arr, 3).map(function (e) { return e.join(' ') }) console.log(example) //=> ["first second third", "fourth fifth sixth" ] // A list of pairs example = partition(arr, 2) console.log(example) //=> [ ["first", "second"], ["third", "fourth"], ["fifth", "sixth"] ] // A list of one-element arrays, skipping the first element example = partition(arr, 1, 1) console.log(example) //=> [ ["second"], ["third"], ["fourth"], ["fifth"], ["sixth"] ]
原文:好的,看来我可能是第一次误解了你的问题。 看来您的目标是映射数组元素组; 比方说一次配对而不是一对。
下面是一个函数map
,它采用与本地Array#map
类似的参数。 不要让函数签名对您造成太大威胁。 它非常易于使用,几乎不需要传递三个以上的参数。
function map(array, groupSize, callback, offset, context) {
参数:
array
—您要映射到的数组。
groupSize
—您希望一次查看的元素数。
callback
—传递的映射函数,它将接收1)一组元素, 2)当前组中第一个元素的索引以及3)原始数组。
offset
—第一组应从其开始的索引; 允许跳过元素。
context
-确定什么this
是你的回调必然。
返回:
一个数组,该数组按顺序包含对每组元素进行的callback
调用的返回值。
演示:
var arr = ["first", "second", "third", "fourth", "fifth", "sixth" ], example // Groups of three, joined by spaces example = map(arr, 3, function (e) { return e.join(' ') }) console.log(example) //=> ["first second third", "fourth fifth sixth" ] // A list of pairs example = map(arr, 2, function (e) { return e }) console.log(example) //=> [ ["first", "second"], ["third", "fourth"], ["fifth", "sixth"] ] function map(array, groupSize, callback, offset, context) { var i = offset | 0, result = [] while (i < array.length) { result.push( callback.call(context, array.slice(i, i + groupSize), i, array) ) i += groupSize } return result }
array.slice()
如果要保留原始数组的原样,或者array.splice()
如果要为两个函数从原始数组中删除的项目,则传递起始索引和该起始索引上的元素数从原始数组中“选择/剪切”
我认为您正在寻找“块”或“分区”概念。 这是指根据某些标准(通常为长度)将数组拆分为子数组。 有很多分区解决方案。 在这里,我们使用一个真正简单的方法。 但是,请注意,这将破坏原始数组。
在对输入进行分区后,您需要连接每个子数组的元素,因此
function partition(array, n) { return array.length ? [array.splice(0, n)].concat(partition(array, n)) : []; } var arr = ["first", "second", "third", "fourth", "fifth", "sixth" ]; var int = 3; const result = partition(arr, int).map(subarray => subarray.join('')) console.log(result);
这是一个更简单的分区实现:
function partition(array, n) {
let result = [], cnt = 0, sub;
for (let i = 0; i < array.length; i++) {
if (!cnt--) cnt = n, result.push(sub = []);
sub.push(array[i]);
}
return result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.