Brian Miller Posted October 16, 2022 Share Posted October 16, 2022 (edited) If I had 2 arrays that looked like this: ["1", "2", "3", "4", "5"] and ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"] and I wanted to make it end up like this: ["A", "1", "B", "2", "C", "3", "C", "4", "E", "5", "F", "G", "H", "I", "J", "K"] What would be the easiest way to do it in JS, especially assuming that we may never know the length of the first two arrays? It should also allow duplicates. Thank you. Link to comment https://www.neowin.net/forum/topic/1422426-js-array-mix/ Share on other sites More sharing options...
0 Brian Miller Posted October 16, 2022 Author Share Posted October 16, 2022 (edited) I've found the solution: var arr1 = ["1", "2", "3", "4", "5"], arr2 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"], arr3 = [], arrLen = Math.min(arr1.length, arr2.length); for (i = 0; i < arrLen; i++) { result.push(arr1[i], arr2[i]); } arr3.push(...arr1.slice(arrLen), ...arr2.slice(arrLen)); console.log(arr3); hellowalkman 1 Share Link to comment https://www.neowin.net/forum/topic/1422426-js-array-mix/#findComment-598769185 Share on other sites More sharing options...
0 pmrd Posted October 16, 2022 Share Posted October 16, 2022 (edited) Your code seems way too complicated for no reason. Here's a better solution if you don't mind modifying the source arrays let array1 = ["1", "2", "3", "4", "5"]; let array2 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"]; let array3 = []; while (array1.length > 0 || array2.length > 0) { if (array1.length > 0) array3.push(array1.shift()) if (array2.length > 0) array3.push(array2.shift()) } Edited October 16, 2022 by PmRd Brian Miller and hellowalkman 1 1 Share Link to comment https://www.neowin.net/forum/topic/1422426-js-array-mix/#findComment-598769186 Share on other sites More sharing options...
0 Brian Miller Posted October 16, 2022 Author Share Posted October 16, 2022 On 15/10/2022 at 20:23, PmRd said: Your code doesn't work and seems way too complicated for no reason. Here's a better solution if you don't mind modifying the source arrays let array1 = ["1", "2", "3", "4", "5"]; let array2 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"]; let array3 = []; while (array1.length > 0 || array2.length > 0) { if (array1.length > 0) array3.push(array1.shift()) if (array2.length > 0) array3.push(array2.shift()) } Thank you. Your method is much more elegant hellowalkman and pmrd 2 Share Link to comment https://www.neowin.net/forum/topic/1422426-js-array-mix/#findComment-598769189 Share on other sites More sharing options...
0 pmrd Posted October 16, 2022 Share Posted October 16, 2022 On 15/10/2022 at 23:30, Brian Miller said: Thank you. Your method is much more elegant If you want the source arrays to remain intact you can do this instead let array1 = ["1", "2", "3", "4", "5"]; let array2 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"]; function mix(arr1, arr2) { let array1clone = [...arr1]; let array2clone = [...arr2]; let result = []; while (array1clone.length > 0 || array2clone.length > 0) { if (array1clone.length > 0) result.push(array1clone.shift()) if (array2clone.length > 0) result.push(array2clone.shift()) } return result; } console.log(mix(array1, array2)); Brian Miller 1 Share Link to comment https://www.neowin.net/forum/topic/1422426-js-array-mix/#findComment-598769190 Share on other sites More sharing options...
0 Brian Miller Posted October 16, 2022 Author Share Posted October 16, 2022 On 15/10/2022 at 20:35, PmRd said: If you want the source arrays to remain intact you can do this instead let array1 = ["1", "2", "3", "4", "5"]; let array2 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"]; function mix(arr1, arr2) { let array1clone = [...arr1]; let array2clone = [...arr2]; let result = []; while (array1clone.length > 0 || array2clone.length > 0) { if (array1clone.length > 0) result.push(array1clone.shift()) if (array2clone.length > 0) result.push(array2clone.shift()) } return result; } console.log(mix(array1, array2)); I like that. Thank you Link to comment https://www.neowin.net/forum/topic/1422426-js-array-mix/#findComment-598769191 Share on other sites More sharing options...
0 +DonC Subscriber² Posted October 16, 2022 Subscriber² Share Posted October 16, 2022 Here's a fancy-pants version that supports an arbitrary number of arrays and also sparse arrays: function mixArrays(...arrays) { const arrayLengths = arrays.map(array => array.length); const maxLength = Math.max(...arrayLengths); let result = []; for (let index = 0; index < maxLength; index++) { for (let array of arrays) { if (index in array) { result.push(array[index]); } } } return result; } Example with two arrays: let array1 = ["1", "2", "3", "4", "5"]; let array2 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"]; let array3 = ["a", "b", "c"]; mixArrays(array1, array2); // ['1', 'A', '2', 'B', '3', 'C', '4', 'D', '5', 'E', 'F', 'G', 'H', 'I', 'J', 'K'] Three arrays: mixArrays(array1, array2, array3); // ['1', 'A', 'a', '2', 'B', 'b', '3', 'C', 'c', '4', 'D', '5', 'E', 'F', 'G', 'H', 'I', 'J', 'K'] And sparse arrays: array1[8] = "8"; mixArrays(array1, array2); // ['1', 'A', '2', 'B', '3', 'C', '4', 'D', '5', 'E', 'F', 'G', 'H', '8', 'I', 'J', 'K'] Brian Miller 1 Share Link to comment https://www.neowin.net/forum/topic/1422426-js-array-mix/#findComment-598769244 Share on other sites More sharing options...
0 Brian Miller Posted October 16, 2022 Author Share Posted October 16, 2022 On 16/10/2022 at 05:39, DonC said: Here's a fancy-pants version that supports an arbitrary number of arrays and also sparse arrays: function mixArrays(...arrays) { const arrayLengths = arrays.map(array => array.length); const maxLength = Math.max(...arrayLengths); let result = []; for (let index = 0; index < maxLength; index++) { for (let array of arrays) { if (index in array) { result.push(array[index]); } } } return result; } Example with two arrays: let array1 = ["1", "2", "3", "4", "5"]; let array2 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"]; let array3 = ["a", "b", "c"]; mixArrays(array1, array2); // ['1', 'A', '2', 'B', '3', 'C', '4', 'D', '5', 'E', 'F', 'G', 'H', 'I', 'J', 'K'] Three arrays: mixArrays(array1, array2, array3); // ['1', 'A', 'a', '2', 'B', 'b', '3', 'C', 'c', '4', 'D', '5', 'E', 'F', 'G', 'H', 'I', 'J', 'K'] And sparse arrays: array1[8] = "8"; mixArrays(array1, array2); // ['1', 'A', '2', 'B', '3', 'C', '4', 'D', '5', 'E', 'F', 'G', 'H', '8', 'I', 'J', 'K'] Thank you, that is totally fancy pants!!! Link to comment https://www.neowin.net/forum/topic/1422426-js-array-mix/#findComment-598769384 Share on other sites More sharing options...
Question
Brian Miller
If I had 2 arrays that looked like this:
and
and I wanted to make it end up like this:
What would be the easiest way to do it in JS, especially assuming that we may never know the length of the first two arrays? It should also allow duplicates.
Thank you.
Link to comment
https://www.neowin.net/forum/topic/1422426-js-array-mix/Share on other sites
7 answers to this question
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now