Array Methods
Array prototype methods available in SSJS — which work natively, which need polyfills, and safe ES3/ES5 alternatives for missing methods.
Modifying Arrays
push / pop
var arr = [1, 2, 3];
arr.push(4); // [1, 2, 3, 4]
var last = arr.pop(); // 4, arr = [1, 2, 3]
shift / unshift
var arr = [1, 2, 3];
var first = arr.shift(); // 1, arr = [2, 3]
arr.unshift(0); // arr = [0, 2, 3]
splice
Array.prototype.splice is broken in SFMC SSJS. The method exists but ignores its first two parameters. Always apply the polyfill from Polyfills before using it.
// After applying the polyfill:
var arr = ["a", "b", "c", "d"];
// Remove 1 element at index 1
arr.splice(1, 1); // ["a", "c", "d"]
// Replace element
arr.splice(1, 1, "X"); // ["a", "X", "d"]
// Insert without removing
arr.splice(1, 0, "B"); // ["a", "B", "X", "d"]
reverse / sort
var arr = [3, 1, 4, 1, 5, 9];
arr.sort(function(a, b) { return a - b; }); // ascending
arr.reverse(); // descending
Reading Arrays
slice
var arr = [0, 1, 2, 3, 4];
arr.slice(1, 3); // [1, 2]
arr.slice(-2); // [3, 4]
arr.slice(); // copy of arr
join
var parts = ["Hello", "World"];
parts.join(", "); // "Hello, World"
parts.join(""); // "HelloWorld"
parts.join(" / "); // "Hello / World"
indexOf (polyfill required)
Array.prototype.indexOf is not available in SFMC SSJS. Apply the polyfill from Polyfills.
Polyfillable Methods
The following methods require polyfills from Polyfills. Once applied they work correctly.
| Method | Notes |
|---|---|
Array.prototype.copyWithin(targetIndex, startIndex, count) |
⚠️ Unavailable |
Array.prototype.entries() |
⚠️ Unavailable |
Array.prototype.fill(value[, start[, end]]) |
⚠️ Unavailable |
Array.prototype.findIndex(fn) |
⚠️ Unavailable |
Array.prototype.includes(searchValue) |
⚠️ Unavailable |
Array.prototype.indexOf(searchValue[, fromIndex]) |
⚠️ Unavailable |
Array.prototype.lastIndexOf(searchValue[, fromIndex]) |
⚠️ Broken — always returns -1 |
Array.prototype.splice(start[, deleteCount[, ...]]) |
⚠️ Broken — ignores parameters |
Array.isArray(value) |
⚠️ Unavailable |
Array.of(...) |
⚠️ Unavailable |
Iteration (Use for loops)
In SSJS, forEach, map, filter, reduce, some, and every are not available. Use for loops instead.
forEach equivalent
// Instead of: arr.forEach(function(item) { ... })
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
// process item
}
map equivalent
// Instead of: var doubled = arr.map(function(x) { return x * 2; })
var doubled = [];
for (var i = 0; i < arr.length; i++) {
doubled.push(arr[i] * 2);
}
filter equivalent
// Instead of: var evens = arr.filter(function(x) { return x % 2 === 0; })
var evens = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] % 2 === 0) {
evens.push(arr[i]);
}
}
reduce equivalent
// Instead of: var sum = arr.reduce(function(acc, x) { return acc + x; }, 0)
var sum = 0;
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
}
find equivalent
// Instead of: var found = arr.find(function(x) { return x.id === targetId; })
var found = null;
for (var i = 0; i < arr.length; i++) {
if (arr[i].id === targetId) {
found = arr[i];
break;
}
}
some/every equivalent
// Instead of: arr.some(function(x) { return x > 10; })
var hasLarge = false;
for (var i = 0; i < arr.length; i++) {
if (arr[i] > 10) { hasLarge = true; break; }
}
// Instead of: arr.every(function(x) { return x > 0; })
var allPositive = true;
for (var i = 0; i < arr.length; i++) {
if (arr[i] <= 0) { allPositive = false; break; }
}
reduceRight equivalent
// Instead of: arr.reduceRight(function(acc, x) { return acc + x; }, 0)
var sum = 0;
for (var i = arr.length - 1; i >= 0; i--) {
sum += arr[i];
}
Array.isArray
Array.isArray is not available in SFMC SSJS. Apply the polyfill from Polyfills.
Flattening / Concatenation
Array.prototype.flat() and Array.prototype.flatMap() are ES6+ and not available. Use:
// Concat arrays
var combined = arr1.concat(arr2);
// Manual flatten (one level)
function flatten(arr) {
var result = [];
for (var i = 0; i < arr.length; i++) {
if (typeof arr[i] === "object" && arr[i].length !== undefined) {
for (var j = 0; j < arr[i].length; j++) {
result.push(arr[i][j]);
}
} else {
result.push(arr[i]);
}
}
return result;
}