我正在尝试编写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]]
答案 0 :(得分:2)
它不适合你的原因是:
remainder
,而不是新数组。并且concat
期望一个数组作为参数,然后它将与另一个数组concat
附加的项目是一个数组,您需要将其嵌套在另一个数组中。我还建议使用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]