35 lines
1.1 KiB
JavaScript
35 lines
1.1 KiB
JavaScript
import { flattenDepth } from './flattenDepth.mjs';
|
|
import { isIndex } from '../_internal/isIndex.mjs';
|
|
import { isKey } from '../_internal/isKey.mjs';
|
|
import { toKey } from '../_internal/toKey.mjs';
|
|
import { at } from '../object/at.mjs';
|
|
import { unset } from '../object/unset.mjs';
|
|
import { isArray } from '../predicate/isArray.mjs';
|
|
import { toPath } from '../util/toPath.mjs';
|
|
|
|
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;
|
|
}
|
|
const path = isArray(index) ? index : toPath(index);
|
|
unset(array, path);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
export { pullAt };
|