转换value为一个数组

本文介绍了如何将单一值转换为一个数组,包括使用JavaScript的Array.from()方法、扩展运算符以及创建新数组等技巧,适合前端开发者和对JavaScript有兴趣的技术人员阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 转换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;

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值