繁体   English   中英

获取数组的n个连续元素

[英]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) {

参数:

  1. array —您要映射到的数组。

  2. groupSize —您希望一次查看的元素数。

  3. callback —传递的映射函数,它将接收1)一组元素, 2)当前组中第一个元素的索引以及3)原始数组。

  4. offset —第一组应从其开始的索引; 允许跳过元素。

  5. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM