将数组附加到数组数组

时间:2016-09-07 15:06:29

标签: coffeescript

我正在尝试编写append函数,这样它就不会改变输入列表:

append([ [1], [2] ], [3])应该等于[ [1], [2], [3] ]

我试过了:

append = (arrayOfArrays, newElem) ->
  [first, remainder...] = arrayOfArrays
  [first, remainder.concat(newElem)]

但它不能按预期工作:

append [[1],[2]], [3] == [[1],[[2],3]]

2 个答案:

答案 0 :(得分:2)

它不适合你的原因是:

  1. 您要附加到remainder,而不是新数组。并且concat期望一个数组作为参数,然后它将与另一个数组
  2. 组合
  3. 在您的情况下,使用concat附加的项目是一个数组,您需要将其嵌套在另一个数组中。
  4. 我还建议使用slice(0)方法复制初始数组,并将一个新数组连接到它,其中包含新数组:

    # Duplicate an array of arrays, and append a new array to it, returning the new array.
    # @params list [Array<Array>] array of arrays
    # @params newItem [Array] new array
    # @return [Array<Array>] duplicate of array with new array appended to it
    append = (list, newItem) ->
      list.slice(0).concat [newItem]
    
    a = [[], [1,1], [2]]
    append a, [3,3]
    # => [[], [1,1], [2], [3,3]]
    a
    # => [[], [1,1], [2]]
    

    Slice将复制部分数组。 slice(0)将从第0个索引开始,并结束,有效地制作数组的副本。

    Concat加入两个数组。但是你想保持新阵列的完好无损。因此,您必须将其包装在另一个数组中,然后将其合并到主数组中。

答案 1 :(得分:1)

由于@ caffeinated.tech打败了我的简单解决方案,这里的方法并没有使用slice技巧。不幸的是,这种方法的复杂性增加,因为您总是需要遍历整个集合。

append = (collection, member) ->
  collection.reduceRight (memo, member) ->
    memo.unshift member
    memo
  , [member]

existing_array = [[1], [2]]
existing_member = [3]
console.log(append(existing_array, existing_member)) # [[1], [2], [3]]
console.log(existing_array)                          # [[1], [2]]
console.log(existing_member)                         # [3]