我正在尝试使用splice方法在第三个参数提供的索引位置中将第一个数组中的值添加到第二个数组中。我有信心我的解决方案会奏效,甚至证明我对slice的理解是正确的。但是,当我在控制台中登录时,它返回为空数组。
我觉得我真的很近,但是缺少一些东西。
function frankenSplice(arr1, arr2, n) {
//copies made as to not disrupt referece.
let array1 = arr1.slice(0, arr1.length);
let array2 = arr2.slice(0, arr2.length);
let mutatedArray = array2.splice(n,0,...array1);
return mutatedArray;}
frankenSplice([1、2、3],[4、5],1)应该返回[4、1、2、3、5]。
此外,这是在函数中创建数组副本的良好用法吗?我正在学习有关引用非基本体的知识,如果我没有记错的话,在函数范围内创建副本可以防止原始引用被修改。在这种情况下不是没有意义的吗?
答案 0 :(得分:2)
问题是splice
的返回值不是被突变的数组,而是removed elements, in an array:
返回值:包含已删除元素的数组。如果仅删除一个元素,则返回一个元素的数组。如果没有删除任何元素,则返回一个空数组。
您不会使用splice
删除任何元素,因此结果是一个空数组。不要将splice
的结果分配给变量,而将return array2
分配给变量:
function frankenSplice(arr1, arr2, n) {
//copies made as to not disrupt referece.
let array1 = arr1.slice(0, arr1.length);
let array2 = arr2.slice(0, arr2.length);
array2.splice(n, 0, ...array1);
return array2;
}
console.log(frankenSplice([1, 2, 3], [4, 5], 1))
还要注意,您可以不带任何参数使用slice()
来创建数组的浅表副本,而无需(0, arr.length)
:
function frankenSplice(arr1, arr2, n) {
//copies made as to not disrupt referece.
let array1 = arr1.slice();
let array2 = arr2.slice();
array2.splice(n, 0, ...array1);
return array2;
}
console.log(frankenSplice([1, 2, 3], [4, 5], 1))
另一种选择是立即返回一个数组,您将原始数组的sliced
个部分扩展到其中,这可能比使用splice
更清晰:
function frankenSplice(arr1, arr2, n) {
return [
...arr2.slice(0, n),
...arr1,
...arr2.slice(n)
];
}
console.log(frankenSplice([1, 2, 3], [4, 5], 1))