JS逻辑处理

109 阅读1分钟

一、if判断优化(includes)

function verifyIdentity(identityId) {
  // identityId == 1 || identityId == 2 || identityId == 3 || identityId == 4
  if ([1, 2, 3, 4].includes(identityId)) {
    return '你的身份合法,请通行!'
  } else {
    return '你的身份不合法'
  }
}

二、数组去重

// Set
function unique(arr) {
  // 利用Array.from将Set结构转换成数组
  return Array.from(new Set(arr))
}

// filter
function unique(arr) {
  return arr.filter((element, index, array) => array.indexOf(element) === index)
}

// reduce
function unique(arr) {
  return arr.sort().reduce((preValue, curValue) => {
    if (preValue.length === 0 || preValue[preValue.length - 1] !== curValue) {
      preValue.push(curValue);
    }
    return preValue;
  }, [])
}

三、数组扁平化(flat)实现

// 一次性扁平化所有--reduce递归
function flattenDeep(arr) {
  return Array.isArray(arr)
  ? arr.reduce((acc, cur) => [...acc, ...flattenDeep(cur)], [])
  : [arr]
}

// 一次性扁平化所有--栈
function flattenDeep(arr) {
  const result = []
  // 将数组元素拷贝至栈,直接赋值会改变原数组
  const stack = [...arr]
  // 如果栈不为空,则循环遍历
  while (stack.length !== 0) {
    const val = stack.pop()
    if (Array.isArray(val)) {
      // 如果是数组再次入栈,并且展开了一层
      stack.push(...val)
    } else {
      // 如果不是数组,就用头插法插入到结果数组中
      result.unshift(val)
    }
  }
  return result
}
flattenDeep(["a", ["b", "c"], ["d", ["e", ["f"]], "g"]])

// flat实现
function flat(arr, depth = 1) {
  return depth > 0
    ? (arr.reduce((acc, cur) => {
      if (Array.isArray(cur)) {
        return [...acc, ...flat(cur, depth - 1)]
      }
      return [...acc, cur]
    }, []))
  : arr
}
flat(["a", ["b", "c"], ["d", ["e", ["f"]], "g"]])
flat(["a", ["b", "c"], ["d", ["e", ["f"]], "g"]], 2)