【问题标题】:How to make _lodash.zip with less code如何用更少的代码制作 _lodash.zip
【发布时间】:2018-08-25 05:36:15
【问题描述】:

定义:创建一个由分组元素组成的数组,第一个包含给定数组的第一个元素,第二个包含给定数组的第二个元素,以此类推。

目前的解决方案:

 const zip = (...arr) => { 
     let maxLength = 0 
     let res = [] 
     for (let el of arr) { 
        maxLength = Math.max(maxLength, el.length) 
     } 
     for (let j = 0; j < maxLength; j++) { 
        const foo = [] 
        for (let n of arr) { 
           foo.push(n[j]) 
        } 
        res.push(foo) 
     } 
     return res 
  }

测试用例:

test(('zip', () => {
  expect(zip([1, 2], [4, 5], [9, 1])).toEqual([[1, 4, 9], [2, 5, 1]])
}

test('zip', () => {
  expect(zip([1, 2, 3], [4, 5, 6])).toEqual([[1, 4], [2, 5], [3, 6]])
})

test('zip', () => {
  expect(zip([1, 2], [], [3, 4, 5])).toEqual([
    [1, undefined, 3],
    [2, undefined, 4],
    [undefined, undefined, 5],
  ])
})

我想要一个更好的方法来实现 zip,目前的解决方案很丑

【问题讨论】:

  • 欢迎来到 Stack Overflow!请查看tour,环顾四周,并通读help center,尤其是How do I ask a good question? 如果您需要在您的问题中添加代码(并且您确实这样做了),请使用“编辑”链接并正确格式化,请勿在评论中发布。另外,明确你的要求。代码有效吗?如果它不起作用,如何不起作用?您在调试它以使其工作时发现了什么?等等。
  • 你有什么问题?
  • @Terry 如何用更好的方式制作 _lodash.zip
  • 这不是一个好问题。您当前需要解决的问题是什么,为什么?你不能指望人们成为读心者;-)
  • @cbll 对不起,我已经更新了我的问题和描述

标签: javascript arrays ecmascript-6 lodash


【解决方案1】:

请参阅Destructuring AssignmentArray.prototype.map 了解更多信息。

// Proof.
const zip = (...args) => [...new Array(Math.max(...args.map(arr => arr.length)))].map((x, i) => args.map((y) => y[i]))

// Proof.
console.log(zip([1, 2], [4, 5], [9, 1])) // [[1, 4, 9], [2, 5, 1]]
console.log(zip([1, 2, 3], [4, 5, 6])) // [[1, 4], [2, 5], [3, 6]]
console.log(zip([1, 2], [], [3, 4, 5])) // [[1, undefined, 3], [2, undefined, 4], [undefined, undefined, 5]]

【讨论】:

  • 第三个测试用例失败了
  • 现在应该可以通过了✌️
  • 太棒了!谢谢你的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 2021-01-08
相关资源
最近更新 更多