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
|