Hi, after looking into splice and slice it seems this should work but it’s not. The hint is also asking to splice and loop, but I’m not sure why i’d need to use slice to “create a copy of the second array inside of function” etc.
Your code so far
function frankenSplice(arr1, arr2, n) {
return arr2.splice(n, 0, arr1); // start at index n, doesn't delete anything, pushes in arr1
}
console.log(frankenSplice([1, 2, 3], [4, 5], 1));
// copy arr1 to arr2 in order starting at index of n
// return result of the above
// slice = which indexes to delete (1,3) = 2
// splice = remove/replace and or add new element (index, how many to delete, new element)
Your browser information:
User Agent is: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36.
Thank you. Looks like I’m running into a looping issue as it’s returning [ 4, 2, 2, 2, 5 ] what do you think is my mistake here?
function frankenSplice(arr1, arr2, n) {
const newArr1 = [...arr1];
const newArr2 = [...arr2];
for (let i = 0; i < newArr1.length; i++) { // while i is less than length of arr1
newArr2.splice(n, 0, newArr1[1]); // place arr1[0][1][2] into arr2 at index n without deleting anything
}
return newArr2;
}
console.log(frankenSplice([1, 2, 3], [4, 5], 1));
** edit just realized I place newArr1[1] vs newArr1[i] but now it’s returning [ 4, 3, 2, 1, 5 ] it should be [ 4, 1, 2, 3, 5 ]
OK, I think you might have made things a little more complex than they need to be
First, you are creating a good copy of arr2 now. You don’t need to create a copy of arr1 since you aren’t changing anything in that array.
I think you realized that splice can’t take an array as the third argument and so you are trying to add each element one at a time using the for loop. The documentation may not have been super clear, but splice can take more than three arguments. In fact, it can take an unlimited amount of arguments. Any arguments after the first two are values that will be spliced into the array. From the documentation:
let arrDeletedItems = arr.splice(start[, deleteCount[, item1[, item2[, ...]]]])
Forget that the square brackets are there for a moment (that just means they are optional arguments). So we have:
let arrDeletedItems = arr.splice(start, deleteCount, item1, item2, ...)
item1, item2, … will all be spliced into the array. So the key here is that you need to convert arr1 from an array to a list of values that can be passed into splice. The good news is that you are already doing this, so you have an example of how to do it. Do you see where you are doing this already?
The question is where am I converting arr1 from an array to a list of value?
If so, I believe it’s when I’m running the for loop here right
for (let i = 0; i < newArr1.length; i++) { // while i is less than arr1
newArr2.splice(n, 0, newArr1[i]); // place arr1[0][1][2] into arr2 at index n without deleting anything
I thought it would run
newArr2.splice(n, 0, newArr1[0]) = newArr2.splice(n, 0, 1)
newArr2.splice(n, 0, newArr1[1]) = newArr2.splice(n, 0, 2)
newArr2.splice(n, 0, newArr1[2]) = newArr2.splice(n, 0, 3)
It’s always adding the value at index n in the array, which is not what you want. If you want to keep doing this with a for loop then you will need to take that into account.
My advice, forget the for loop. You don’t need it. The key here is passing the correct arguments into splice.
As you’ve figure out, the third argument to splice can’t be an array, so passing arr1 here won’t work. I’ve tried to explain what it needs to be instead above. Reread what I wrote and see if you can figure it out.
That’s the only thing left to do. If you understand what this is doing:
const newArr2 = [...arr2];
Then you should be able to solve it. If you don’t understand what that is doing then you need to figure that out first.
Yes, at a high level it is “cloning” an array, but it isn’t using an operator that specifically does the cloning.
When you create an array, you can define it with several values as:
const array = [0, 1, 2, 3, 4];
Look at what is inside of the square brackets. Does that look like a list of numbers to you? Does that sound like what the splice method wants? Now look at how you are cloning the array:
const newArr2 = [...arr2];
So what do you think ...arr2 is doing? Remember, to define an array with multiple values you have to use a comma separated list.
Once we discussed I can’t use the array I cloned it or copied it based on these instructions . You are implying that it’s not right? …arr2 = 4,5 based on my understanding.
I don’t understand and I know you’re trying to hint at something, but I’m not making any progress here.
if arr1 can’t be a array then I tried making it a string
function frankenSplice(arr1, arr2, n) {
var arrString = arr1.toString();
const newArr2 = [...arr2];
return newArr2.splice(n, 0, arrString);
}
Can we ignore previous comments and just re-explain what I need to do? (the above repsonses are just confusing me at this point maybe)
Converting arr1 to a string won’t do it. You aren’t trying to splice a string into the array, you are trying to splice all of the numbers in arr1. So you can get rid of that first line.
I put a question mark at the end where the only remaining issue is. We know you can’t just put arr1 there because that is an array and splice doesn’t take an array as an argument. What it does take is a bunch of values separated by commas, for example:
return newArr2.splice(n, 0, 5, 6, 7, 8);
This would splice the values 5, 6, 7, 8 into the array at index n. So what you need to do is convert arr1 into a list of separate values like that. I’ve pointed out that you are already doing this when cloning arr2, so you have an example of how to do it. The cloning method you are using is using the spread operator.
You’re right, I am giving you every hint I can think of without just giving you the answer. You are very close. Once you understand what the spread operator is doing when you are cloning arr2 then I think you will understand what you need to do for the third argument in splice.
I’m already doing what I need to do to arr2? I would think that would be to make const newArr1 = [...arr1] then use newArr1 as third argument but it’s not.
Using console.log I know that […arr2] = [ 4, 5 ]
I still don’t know what to do
I’ve also tried using …arr1 as third argument
I just looked at the solution and saw I couldn’t use the return on the same line. I refuse to spend over 2hrs on a solution when I’m only missing 10% and I’m not making progress over a prolong time period
It’s right there in front of you Remove the square brackets, you get:
...arr2 = 4,5
So if you had ...arr2 as the last argument to splice it would be the same as:
newArr2.splice(n, 0, 4, 5);
So if you want to pass a comma delimited list of values of arr1 into splice instead, how would you do that?
Also, I forgot to mention one last thing. You can’t have the splice method on the same line as the return because splice returns an array of element removed (or an empty array if none were removed). So you need to do the splice method first on its own line and then return newArr; on its own line.
Yeah but it wasn’t working even though earlier I tried …arr1 because as you said the return method. So I had two issues at the same time unfortunately.
The last few problems my issue has been something like this where I’m not aware of a rule (ie can’t use array as third argument, or can’t return on splice). How would I find this for the future? My understanding is that memorization is not a big element in coding so I presume I shouldn’t have to memorize these rules