I have var ar = [1, 2, 3, 4, 5] and want some function getSubarray(array, fromIndex, toIndex), that result of call getSubarray(ar, 1, 3) is new array [2, 3, 4].
5 Answers
Take a look at Array.slice(begin, end)
const ar = [1, 2, 3, 4, 5];
// slice from 1..3 - add 1 as the end index is not included
const ar2 = ar.slice(1, 3 + 1);
console.log(ar2); // -> [2, 3, 4]
// the original ar is unmodified.
console.log(ar); // -> [1, 2, 3, 4, 5]
5 Comments
ar is unmodified. console.log(ar); // -> [1, 2, 3, 4, 5]slice() method with splice(): splice() changes the original array while slice() doesn't.ar.slice(4, 4);? I guess I should try out :x..end is greater than the length of the sequence, slice extracts through to the end of the sequence (arr.length). developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…slice does not raise exceptions for any type of input (string, undefined, object whatever). If start is out of range (negative or greater than the length), it just returns an empty array.For a simple use of slice, use my extension to Array Class:
Array.prototype.subarray = function(start, end) {
if (!end) { end = -1; }
return this.slice(start, this.length + 1 - (end * -1));
};
Then:
var bigArr = ["a", "b", "c", "fd", "ze"];
Test1:
bigArr.subarray(1, -1);
< ["b", "c", "fd", "ze"]
Test2:
bigArr.subarray(2, -2);
< ["c", "fd"]
Test3:
bigArr.subarray(2);
< ["c", "fd","ze"]
Might be easier for developers coming from another language (i.e. Groovy).
3 Comments
Array.prototype.contains to Array.prototype.includes.subarray method delivers unexpected results. bigArr.slice(1,-1) returns ['b','c','fd'], which you would expect (the -1 knocks one element off the end of the new array). But bigArr.subarray(1,-1) returns the same as bigArr.subarray(1), which is to say everything from position 1 to the end of bigArr. You're also forcing users to always give negative numbers as the end parameter. Any end >= -1 gives the same result as when end === undefined. On the other hand, bigArr.slice(1,3) returns ['b','c'], which again is expected.I have var ar = [1, 2, 3, 4, 5] and want some function getSubarray(array, fromIndex, toIndex), that result of call getSubarray(ar, 1, 3) is new array [2, 3, 4].
Exact Solution
function getSubarray(array, fromIndex, toIndex) {
return array.slice(fromIndex, toIndex+1);
}
Let's Test the Solution
let ar = [1, 2, 3, 4, 5]
getSubarray(ar, 1, 3)
// result: [2,3,4]
Array.prototype.slice()
The slice() method returns a shallow copy of a portion of an array into a new array object selected from start to end (end not included) where start and end represent the index of items in that array. The original array will not be modified.
Basically, slice lets you select a subarray from an array.
For example, let's take this array:
const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];
Doing this:
console.log(animals.slice(2, 4));
Will give us this output:
// result: ["camel", "duck"]
Syntax:
slice() // creates a shallow copy of the array
slice(start) // shows only starting point and returns all values after start index
slice(start, end) // slices from start index to end index
Comments
const array_one = [11, 22, 33, 44, 55];
const start = 1;
const end = array_one.length - 1;
const array_2 = array_one.slice(start, end);
console.log(array_2);
1 Comment
The question is actually asking for a New array, so I believe a better solution would be to combine Abdennour TOUMI's answer with a clone function:
function clone(obj) {
if (null == obj || "object" != typeof obj) return obj;
const copy = obj.constructor();
for (const attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
}
return copy;
}
// With the `clone()` function, you can now do the following:
Array.prototype.subarray = function(start, end) {
if (!end) {
end = this.length;
}
const newArray = clone(this);
return newArray.slice(start, end);
};
// Without a copy you will lose your original array.
// **Example:**
const array = [1, 2, 3, 4, 5];
console.log(array.subarray(2)); // print the subarray [3, 4, 5, subarray: function]
console.log(array); // print the original array [1, 2, 3, 4, 5, subarray: function]
[http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object]
4 Comments
Array.prototype.slice returns a copy already. Array.prototype.splice modifies the original array.slice already returns a shallow copy, making this subarray implementation unnecessary. But it's also worth mentioning you've monkey-patched a builtin object, which is a big no-no. See the comments on Abdennour TOUMI's answer.