/**
* 转换value为一个数组
* Converts `value` to an array
* @param {*} value The value to convert
* @returns {Array} Returns the converted array
* @example
* toArray({'a': 1, 'b': 2})
* // => [1, 2]
* toArray('abc')
* // => ['a', 'b', 'c']
* toArray(1)
* // => []
* toArray(null)
* // => []
* toArray(new Map([["name", "张三"], ["title", "Author"]]))
* // => [[name,张三],[title,Author]]
* toArray(new Set([1, 2, 3, 4, 4]))
* // => [1,2,3,4]
*/
const funcTag = "[object Function]"
const genTag = "[object GeneratorFunction]"
const asyncTag = "[object AsyncFunction]"
const stringTag = "[object String]"
const mapTag = "[object Map]"
const setTag = "[object Set]"
const symIterator = Symbol ? Symbol.iterator : undefined
function isObject(value) {
var type = typeof value
return value != null && (type === "object" || type === "function")
}
function isFunction(value) {
if (!isObject) {
return false
}
var tag = Object.prototype.toString.call(value)
return tag === funcTag || tag === genTag || tag === asyncTag
}
function isLength(value) {
return (
typeof value == "number" &&
value > -1 &&
value % 1 === 0 &&
value <= MAX_SAFE_INTEGER
)
}
function isArrayLike(value) {
return value != null && !isFunction(value) && isLength(value.length)
}
function isObjectLike(value) {
return typeof value == "object" && value !== null;
}
function isString(value) {
return (
typeof value === "string" ||
(isObjectLike(value) && Object.prototype.toString.call(value) === stringTag)
)
}
function stringToArray(string) {
return string.split("")
}
function copyArray(source, array) {
var index = -1,
length = source.length
array || (array = Array(length))
while (++index < length) {
array[index] = source[index]
}
return array
}
function mapToArray(map) {
var index = -1,
result = Array(map.size)
map.forEach(function(value, key) {
result[++index] = [key, value]
})
return result
}
function setToArray(set) {
var index = -1,
result = Array(set.size)
set.forEach(function(value) {
result[++index] = value
})
return result
}
// Converts `iterator` to an array.
function iteratorToArray(iterator) {
const result = []
let data = ""
while (!(data = iterator.next()).done) {
result.push(data.value)
}
return result
}
function toArray(value) {
if (!value) {
return []
}
if (isArrayLike(value)) {
return isString(value) ? stringToArray(value) : copyArray(value)
}
// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator
if (symIterator && value[symIterator]) {
return iteratorToArray(value[symIterator]())
}
const tag = Object.prototype.toString.call(value)
const func =
tag === mapTag ? mapToArray : tag === setTag ? setToArray : Object.values
return func(value)
}
export default toArray
// 方法二
function toArray(value) {
if (!value) {
return []
}
if (Object.prototype.toString.call(value) === "[object Object]") {
return Object.values(value)
}
return Array.from(value)
}
export default toArray;