locutus
Version:
Locutus other languages' standard libraries to JavaScript for fun and educational purposes
44 lines (43 loc) • 1.54 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.splitn = splitn;
function splitn(n, delimiter, str) {
// discuss at: https://locutus.io/rust/splitn/
// parity verified: Rust 1.85
// original by: Kevin van Zonneveld (https://kvz.io)
// note 1: Produces at most n fields; the last field contains the unsplit remainder.
// example 1: splitn(3, ' ', 'Mary had a little lamb')
// returns 1: ['Mary', 'had', 'a little lamb']
// example 2: splitn(1, 'X', 'abcXdef')
// returns 2: ['abcXdef']
// example 3: splitn(3, 'X', 'lionXXtigerXleopard')
// returns 3: ['lion', '', 'tigerXleopard']
const limit = Math.trunc(Number(n));
if (!Number.isFinite(limit) || limit <= 0) {
return [];
}
const source = String(str);
const value = String(delimiter);
if (limit === 1) {
return [source];
}
if (value === '') {
const parts = ['', ...Array.from(source), ''];
if (parts.length <= limit) {
return parts;
}
return [...parts.slice(0, limit - 1), parts.slice(limit - 1).join('')];
}
const out = [];
let remainder = source;
for (let i = 0; i < limit - 1; i += 1) {
const index = remainder.indexOf(value);
if (index < 0) {
break;
}
out.push(remainder.slice(0, index));
remainder = remainder.slice(index + value.length);
}
out.push(remainder);
return out;
}