9. equals:全等判断

在两个变量之间进行深度比较以确定它们是否全等。
此代码段精简的核心在于Array.prototype.every()的使用。

  1. const equals = (a, b) => {
  2. if (a === b) return true;
  3. if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();
  4. if (!a || !b || (typeof a !== 'object' && typeof b !== 'object')) return a === b;
  5. if (a.prototype !== b.prototype) return false;
  6. let keys = Object.keys(a);
  7. if (keys.length !== Object.keys(b).length) return false;
  8. return keys.every(k => equals(a[k], b[k]));
  9. };

用法:

  1. equals({ a: [2, { e: 3 }], b: [4], c: 'foo' }, { a: [2, { e: 3 }], b: [4], c: 'foo' }); // true

10.批量修改key值

  • 方法一

    1. var result = array.map(o=>{return{value:o.id, label:o.name}});
    2. console.log(result);
  • 方法二 ```javascript var array = [ {

    1. id:1,
    2. name:"小明"

    }, {

    1. id:2,
    2. name:"小红"

    } ];

function convertKey(arr,keyMap){ let tempString = JSON.stringify(arr); for(var key in keyMap){ var reg = /"${key}":/g; tempString = tempString.replace(eval(reg),’”‘+keyMap[key]+’”:’); } return JSON.parse(tempString); }

convertKey(array,{‘id’:’value’,’name’:’label’});

  1. - 方法三
  2. ```javascript
  3. var arr = [
  4. {
  5. id:1,
  6. name:"小明"
  7. },
  8. {
  9. id:2,
  10. name:"小红"
  11. }
  12. ];
  13. var newArr = arr.map(function(item) {
  14. return {
  15. value: item['id'],
  16. lable: item['name']
  17. }
  18. })
  19. console.log(newArr)
  • 方法四
  1. var test = {
  2. nodeId: "1",
  3. nodeName: "第一个",
  4. children: [
  5. {
  6. nodeId: "1-1",
  7. nodeName: "客户状态",
  8. children: [
  9. {
  10. nodeId: "1-1-1",
  11. nodeName: "包含(实名制停机,IPBUS帐户封锁停机)",
  12. children: [
  13. {
  14. nodeId: "1-1-1-1",
  15. nodeName: "积分",
  16. children: []
  17. },
  18. {
  19. nodeId: "1-1-1-2",
  20. nodeName: "是否通信客户",
  21. children: []
  22. }
  23. ]
  24. }
  25. ]
  26. }
  27. ]
  28. };
  29. // 批量修改tree数据中的nodeId为id
  30. console.log(JSON.parse(JSON.stringify(test).replace(/"nodeId"/g, '"id"')) );

11.json字符串转json对象

  1. function parse(val) {
  2. return typeof val === "string" ? JSON.parse(val) : val;
  3. }

12.json对象转json字符串

  1. function stringify(val) {
  2. return typeof val !== "string" ? JSON.stringify(val) : val;
  3. }

13.tree数据倒查

  • 根据子id查父id
  1. var test = {
  2. nodeId: "1",
  3. nodeName: "第一个",
  4. children: [
  5. {
  6. nodeId: "1-1",
  7. nodeName: "客户状态",
  8. children: [
  9. {
  10. nodeId: "1-1-1",
  11. nodeName: "包含(实名制停机,IPBUS帐户封锁停机)",
  12. children: [
  13. {
  14. nodeId: "1-1-1-1",
  15. nodeName: "积分",
  16. children: []
  17. },
  18. {
  19. nodeId: "1-1-1-2",
  20. nodeName: "是否通信客户",
  21. children: []
  22. }
  23. ]
  24. }
  25. ]
  26. }
  27. ]
  28. };
  29. //传入参数:需要遍历的json,需要匹配的id
  30. function findPnodeId(data, nodeId) {
  31. //设置结果
  32. let result;
  33. if (!data) {
  34. return; //如果data传空,直接返回
  35. }
  36. for (let i = 0; i < data.children.length; i++) {
  37. let item = data.children[i];
  38. if (item.nodeId == nodeId) {
  39. result = data;
  40. //找到id相等的则返回父id
  41. return result;
  42. } else if (item.children && item.children.length > 0) {
  43. //如果有子集,则把子集作为参数重新执行本方法
  44. result = findPnodeId(item, nodeId);
  45. //关键,千万不要直接return本方法,不然即使没有返回值也会将返回return,导致最外层循环中断,直接返回undefined,要有返回值才return才对
  46. if (result) {
  47. return result;
  48. }
  49. }
  50. }
  51. //如果执行循环中都没有return,则在此return
  52. return result;
  53. }
  54. console.log(findPnodeId(test, "1-1-1-2"));

5. 第五部分:数字

1. randomIntegerInRange:生成指定范围的随机整数

  1. const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
  2. randomIntegerInRange(0, 5); // 3

2. randomNumberInRange:生成指定范围的随机小数

  1. const randomNumberInRange = (min, max) => Math.random() * (max - min) + min;
  2. randomNumberInRange(2, 10); // 6.0211363285087005

3. round:四舍五入到指定位数

  1. const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
  2. round(1.005, 2); // 1.01

4. sum:计算数组或多个数字的总和

  1. const sum = (...arr) => [...arr].reduce((acc, val) => acc + val, 0);
  2. sum(1, 2, 3, 4); // 10
  3. sum(...[1, 2, 3, 4]); // 10

5. toCurrency:简单的货币单位转换

  1. const toCurrency = (n, curr, LanguageFormat = undefined) =>
  2. Intl.NumberFormat(LanguageFormat, { style: 'currency', currency: curr }).format(n);
  3. toCurrency(123456.789, 'EUR'); // €123,456.79
  4. toCurrency(123456.789, 'USD', 'en-us'); // $123,456.79
  5. toCurrency(123456.789, 'USD', 'fa'); // ۱۲۳٬۴۵۶٫۷۹
  6. toCurrency(322342436423.2435, 'JPY'); // ¥322,342,436,423

6. 第六部分:浏览器操作及其它

21. size:获取不同类型变量的字节长度

这个的实现非常巧妙,利用Blob类文件对象的特性,获取对象的长度。
另外,多重三元运算符,是真香。

  1. const size = val => Array.isArray(val) ? val.length : val && typeof val === 'object'? val.size || val.length || Object.keys(val).length
  2. : typeof val === 'string'? new Blob([val]).size: 0;size([1, 2, 3, 4, 5]); // 5
  3. size('size'); // 4
  4. size({ one: 1, two: 2, three: 3 }); // 3

22. escapeHTML:转义HTML

当然是用来防XSS攻击啦。

  1. const escapeHTML = str =>
  2. str.replace(
  3. /[&<>'"]/g,
  4. tag =>
  5. ({
  6. '&': '&amp;',
  7. '<': '&lt;',
  8. '>': '&gt;',
  9. "'": '&#39;',
  10. '"': '&quot;'
  11. }[tag] || tag)
  12. );
  13. escapeHTML('<a href="#">Me & you</a>'); // '&lt;a href=&quot;#&quot;&gt;Me &amp; you&lt;/a&gt;'

23.代码查看容器

  1. function myAlert(val) {
  2. val = typeof val !== "string" ? JSON.stringify(val) : val;
  3. var str = `<div id="code-con" style="padding:20px;width: 300px;height:300px;max-height: 400px;border: 1px solid red;background-color: #252526;position: absolute;z-index: 99999;color: #fff;overflow-y: auto;word-wrap: break-word;word-break: break-all;left: 10%;top: 10%;">
  4. <span class="code-close" style="position:absolute;right:10px;top:5px; cursor:pointer">X</span>
  5. ${val}
  6. </div>`;
  7. var body = document.querySelector("body");
  8. body.innerHTML += str;
  9. var codeCon = document.querySelector("#code-con");
  10. var close = document.querySelector("#code-con .code-close");
  11. close.onclick = function() {
  12. codeCon.style.display = "none";
  13. };
  14. }