有这样的一个数组,如何做下这种结果呢?

有这样的数组[1,2,3,4,5],如何实现[[1,2], [2,3], [3,4] ....] 一出一入?

阅读 2.3k
4 个回答
[1,2,3,4,5].reduce((res, v, i, arr) => {
    if(i < arr.length-1) res.push([v, arr[i+1]])
    return res;
}, [])
var arr = [1, 2, 3, 4, 5]
arr = (arr.map((item, index) => (arr[index + 1]?[arr[index], arr[index + 1]]:undefined))).filter(item=>item)
新手上路,请多包涵
const a = [1,2,3,4,5]
const b = a.map((item,index)=>[item,a[index+1]])
b.pop()

不管你信不信,我又一次使用 Array.prototype.reduce 实现了你的需求:

const result = [1,2,3,4,5,6]
    .reduce((a, b, i) => 
        // 这是关键的一步,如果当前 a 的长度加于 1,那么就往 a 里面每次添加两条记录,分别为 a 最后一项以及 b
        a.length > 1 ? a.concat([a[a.length - 1], b]) : a.concat([b]), []
    )
    .reduce((a, b, i) => 
        // 这一步用来生成最终的结果数组,如果为偶数,则直接往 a 最后面加一条 `[b]` 作为元素
        // 如果为奇数,则从 a 里面删除最后一项,同时最后一项加上一个 b 之后,又重新添加至 a
        // 最后得到提主想到的结果,当然这并不是最简单的方式,不太容易让人看懂
        i % 2 === 0 ? a.concat([[b]]) : a.concat([a.pop().concat([b])]) , []
    )

使用 Array.prototype.map 的方式:

const result = [1,2,3,4,5,6]
    // 这里的关键是必须要使用到 `map` 方法的第三个参数,否则就需要把数组存储在一个变量里面了
    .map((a, i, o) => [a, o[i + 1]])
    // 因为上面这个 `map` 会导致最后一项是不应该出现的,其判断条件可以是
    // 最后一项目的第 `1` 个元素为 `undefined`
    .filter(e => e[1] !== undefined);

不使用 Array.prototype 的方式:

const original = [1,2,3,4,5];
const result = [];
for (let i = 0; i < original.length - 1; i += 1) {
  result.push([original[i], original[i + 1]])
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题