37 lines
1.0 KiB
JavaScript
37 lines
1.0 KiB
JavaScript
|
'use strict'
|
||
|
|
||
|
function getObjectKeys (obj, excludeListItemAccessorsBelowLength) {
|
||
|
const keys = []
|
||
|
let size = 0
|
||
|
|
||
|
// Sort property names, they should never be order-sensitive
|
||
|
const nameCandidates = Object.getOwnPropertyNames(obj).sort()
|
||
|
// Comparators should verify symbols in an order-insensitive manner if
|
||
|
// possible.
|
||
|
const symbolCandidates = Object.getOwnPropertySymbols(obj)
|
||
|
|
||
|
for (let i = 0; i < nameCandidates.length; i++) {
|
||
|
const name = nameCandidates[i]
|
||
|
|
||
|
let accept = true
|
||
|
if (excludeListItemAccessorsBelowLength > 0) {
|
||
|
const index = Number(name)
|
||
|
accept = (index % 1 !== 0) || index >= excludeListItemAccessorsBelowLength
|
||
|
}
|
||
|
|
||
|
if (accept && Object.getOwnPropertyDescriptor(obj, name).enumerable) {
|
||
|
keys[size++] = name
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (let i = 0; i < symbolCandidates.length; i++) {
|
||
|
const symbol = symbolCandidates[i]
|
||
|
if (Object.getOwnPropertyDescriptor(obj, symbol).enumerable) {
|
||
|
keys[size++] = symbol
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return { keys, size }
|
||
|
}
|
||
|
module.exports = getObjectKeys
|