44 lines
1.6 KiB
JavaScript
44 lines
1.6 KiB
JavaScript
import { isArray } from "../predicate/isArray.mjs";
|
|
import { toKey } from "../_internal/toKey.mjs";
|
|
import { toPath } from "../util/toPath.mjs";
|
|
import { isIndex } from "../_internal/isIndex.mjs";
|
|
import { flattenDepth } from "./flattenDepth.mjs";
|
|
import { isKey } from "../_internal/isKey.mjs";
|
|
import { at } from "../object/at.mjs";
|
|
import { unset } from "../object/unset.mjs";
|
|
//#region src/compat/array/pullAt.ts
|
|
/**
|
|
* Removes elements from an array at specified indices and returns the removed elements.
|
|
*
|
|
* @template T
|
|
* @param {ArrayLike<T>} array - The array from which elements will be removed.
|
|
* @param {Array<number | readonly number[] | string | readonly string[]>} _indices - An array of indices specifying the positions of elements to remove.
|
|
* @returns {ArrayLike<T>} An array containing the elements that were removed from the original array.
|
|
*
|
|
* @example
|
|
* const numbers = [10, 20, 30, 40, 50];
|
|
* const removed = pullAt(numbers, [1, 3, 4]);
|
|
* console.log(removed); // [20, 40, 50]
|
|
* console.log(numbers); // [10, 30]
|
|
*/
|
|
function pullAt(array, ..._indices) {
|
|
const indices = flattenDepth(_indices, 1);
|
|
if (!array) return Array(indices.length);
|
|
const result = at(array, indices);
|
|
const indicesToPull = indices.map((index) => isIndex(index, array.length) ? Number(index) : index).sort((a, b) => b - a);
|
|
for (const index of new Set(indicesToPull)) {
|
|
if (isIndex(index, array.length)) {
|
|
Array.prototype.splice.call(array, index, 1);
|
|
continue;
|
|
}
|
|
if (isKey(index, array)) {
|
|
delete array[toKey(index)];
|
|
continue;
|
|
}
|
|
unset(array, isArray(index) ? index : toPath(index));
|
|
}
|
|
return result;
|
|
}
|
|
//#endregion
|
|
export { pullAt };
|