如何解决为什么我必须在这种情况下使用传播语法?
我正在尝试解决这个 leetcode 问题:https://leetcode.com/problems/subsets/
这是有效的代码:
function subset(set) {
const result = [];
helper(set,[],result);
return result;
}
function helper(set,i,slate,result) {
if(i === set.length) {
result.push([...slate]);
return result;
}
// exclude i
helper(set,i+1,result);
// include i
slate.push(set[i]);
helper(set,result);
slate.pop();
}
subset([1,2,3])
对于这里的这一行:
result.push([...slate]);
为什么当我将其更改为 result.push(slate)
或 result.push(...slate)
时,即使 slate
本身是一个数组,它们都不起作用?
对于result.push(slate)
的情况:这是不是因为JavaScript中数组是通过引用存储的,所以当我在这里执行 slate.pop();
时,它也会弹出推入结果数组的那个项目?
但是,我不理解另一种情况 (result.push(slate)
),因为在这种情况下,似乎是推入单个项目,而不是包含每个项目的数组。这是为什么?
解决方法
您对第一种情况确实是正确的,但对于您的第二种情况,这是因为 Array.prototype.push 的签名是
arr.push([element1[,...[,elementN]]])
这是一个可变参数函数(一个可以接受无限数量参数的函数)。所以当你打电话
// given slate = [1,2,3]
result.push(...slate);
// is the same as calling
result.push(1,3)
因为您的数组 slate
被“扩展”为 push
的单个参数。这会将 1,3 作为单独的数组元素添加到 result
打电话时
// given slate = [1,3]
result.push([...slate]);
// is the same as calling
result.push([1,3])
这在您的情况下是正确的,并且会将数组 [1,3] 作为单个元素添加到 result
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。