IanSun

IanSun 查看完整档案

上海编辑  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

IanSun 回答了问题 · 4月14日

JS 判断一个对象中的的所有属性值是否相等

/**
 * @param {object} target
 * @return {boolean}
 */
function isObjectValueIdentical (target) {
  return 2 > new Set(Object.values(target)).size;
}

关注 6 回答 5

IanSun 回答了问题 · 4月14日

如果npm发布一个vue组件时同时发布一个与它相关的hook.js

分别发布两个包

首先,你要将这两个单独成包,因为无论如何最终都会成为两个包发布。
如果你不想改动太多的代码,可以在构建阶段将hook的代码分离,并在发布前添加相应的package.json信息。
更好的做法是在创建项目时,将项目作为多项目存储在同一个仓库中。npm7.x开始已支持workspace,其他的可以用lernabolt等。具体的使用方式可以参考各个工具的文档。

发布在同一个包里

你可以将代码拆分后发布在同一个包里,或者不拆分,但使用具名输出让用户分别引入。

关注 2 回答 1

IanSun 回答了问题 · 4月9日

es6class语法转化成es5的疑问

因为如果obj有定义了[[Set]],那么obj[key] = value就会触发[[Set]]定义的函数。

关注 3 回答 2

IanSun 回答了问题 · 4月8日

字符串用特定符号分割

没明白搜索是怎么变成搜搜的。姑且算是笔误吧。

如果只是需要在文字中加|

[].join.call(str, "|");

关注 4 回答 3

IanSun 回答了问题 · 4月6日

js树结构数据递归获取name属性

仅对于这道题

JSON.stringify(obj).match(/(?<="name":").+?(?=")/g);

如果无所谓结果顺序,建议广度优先。

关注 6 回答 6

IanSun 回答了问题 · 4月6日

js遍历树形结构

function filterNodes (nodes = [], callbackfn) {
  const result = [];
  for (const node of nodes) {
    if (callbackfn(node)) {
      const children = filterNodes(node.children, callbackfn);
      result.push({ ...node, children });
    }
  }

  return result;
}

const filteredNodes = filterNodes(
  treeData,
  node => 2 >= node.level && "soft" !== node.type,
);

关注 3 回答 2

IanSun 回答了问题 · 4月6日

JS如何获取到Server抛出的诸如500的错误?

因为你还没有判断状态码就将响应体当作JSON处理了。如需判断状态码:

const response = await fetch("/api/url");
console.log(response.status);

关注 3 回答 2

IanSun 回答了问题 · 4月2日

解决js匹配标签

这种问题如果想要完美匹配的话,只用正则是无法满足的,必须要词法分析才行。
自己实现也比较复杂,因为html可能缺少闭合标签,属性可能缺少引号,属性名是大小写不敏感的,或者其中有换行等等。
所以建议用现成的库来分析,比如parse5posthtml-parserhyntaxhtmlparser2等。

例子:使用parse5解析
import { parseFragment, serialize } from "parse5";

/**
 * @param {string} code
 * @param {string} className
 * @return {Array<string>}
 */
function findHTMLSpanElementWithClassName (code, className) {
  const result = [];

  const nodes = [parseFragment(code)];
  for (const node of nodes) {
    if (
      "span" === node.nodeName &&
      node.attrs.some(
        attr =>
          "class" === attr.name &&
          attr.value.split(/\s+/).includes(className),
      )
    ) {
      result.push(node);
    }

    if (Array.isArray(node.childNodes)) {
      nodes.push(...node.childNodes);
    }
  }

  return result.map(
    node =>
      serialize({
        nodeName: '#document-fragment',
        childNodes: [node],
      }),
  );
}

关注 5 回答 5

IanSun 回答了问题 · 4月2日

如何监听元素发生改变

jQuery
$("#lwp").on("input", function () {
  console.log($(this).val());
});
现代浏览器
lwp.addEventListener("input", ({ target: { value } }) => {
  console.log(value);
});
经典浏览器
document
  .getElementById("lwp")
  .addEventListener("input", function (event) {
    console.log(event.target.value);
  });

关注 3 回答 3

IanSun 回答了问题 · 3月31日

解决数据处理的一个问题

/**
 * @param {unknown} m
 * @param {unknown} n
 * @return {Array<number | string | symbol>}
 */
const diff = (function () {
  const IDENTITY_TYPES = [
    ["number", "string"],
  ];

  /**
   * @param {unknown} m
   * @param {unknown} n
   * @return {boolean}
   */
  function isDiff (m, n) {
    return !isIdentityType(m, n) ||
      (
        isPrimitive(m)
          ? m != n
          : isDiffObject(m, n)
      );
  }

  /**
   * @param {unknown} m
   * @param {unknown} n
   * @return {boolean}
   */
  function isDiffObject (m, n) {
    const mKeys = Reflect.ownKeys(m);
    const nKeys = Reflect.ownKeys(n);

    return mKeys.length !== nKeys.length ||
      Array
        .from(new Set([...mKeys, ...nKeys]))
        .some(key => isDiff(m[key], n[key]));
  }

  /**
   * @param {unknown} m
   * @param {unknown} n
   * @return {boolean}
   */
  function isIdentityType (m, n) {
    const mType = typeof m, nType = typeof n;
    return mType === nType ||
      IDENTITY_TYPES.some(
        types => types.includes(mType) && types.includes(nType),
      );
  }

  /**
   * @param {unknown} t
   * @return {boolean}
   */
  function isPrimitive (t) {
    return "object" !== typeof t;
  }

  return function diff (m, n) {
    if (isPrimitive(m) || isPrimitive(n)) {
      throw new TypeError("diff called on non-object");
    }

    const diffKeys = [];

    const keys = new Set([...Reflect.ownKeys(m), ...Reflect.ownKeys(n)]);
    for (const key of keys) {
      if (isDiff(m[key], n[key])) {
        diffKeys.push(key);
      }
    }

    return diffKeys;
  };
})();

关注 3 回答 2

认证与成就

  • 获得 78 次点赞
  • 获得 9 枚徽章 获得 1 枚金徽章, 获得 1 枚银徽章, 获得 7 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2019-04-08
个人主页被 1.4k 人浏览