js最佳实践方式 (2023/4/3)

94 阅读4分钟

目录

  • 根据函数检查数组元素是否相等
  • 检查数组所有元素是否是唯一值
  • 检查所有数组元素是否基于函数唯一(用函数处理过后是否还唯一)
  • 根据给定属性按字母顺序对对象数组进行排序。
  • 检查两个参数是否为true真。

根据函数检查数组元素是否相等

  • arr 数组的第一个元素放进 fn 四舍五入函数里面.
  • 使用 Array.prototype.every() 检查数组每个元素使用 fn 之后返回的值与第一个值是否相等。
  • 数组中的元素使用严格比较运算符进行比较,该运算符不考虑 NaN
const allEqualBy = (arr, fn) => {
  const eql = fn(arr[0]);
  return arr.every(val => fn(val) === eql);
};
allEqualBy([1.1, 1.2, 1.3], Math.round); // true
allEqualBy([1.1, 1.3, 1.6], Math.round); // false

知识点

  • 四舍五入的方法:
    • numobj.tofixed(小数点后数字的个数):返回值是string类型,计算的时候需要通过转换数据类型。
    • Math.round(numObj):Math的四舍五入返回一个整数的api
  • 如果我们需要实现判断元素的数字部分是否相等,可以加上Number.parseFloat(x),先将元素转化为浮点数
  • Number.parseFloat(x):解析一个参数x(必要时先转换为字符串)并返回一个浮点数。可以用来去除一段带字母字符串中的number



检查数组所有元素是否是唯一值。

  • 创建 Set 对象使数组里面的值不在重复保留唯一值。
  • 使用 Array.prototype.lengthSet.prototype.size 将唯一值数组的长度与原始数组进行比较。
const allUnique = arr => arr.length === new Set(arr).size;
allUnique([1, 2, 3, 4]); // true
allUnique([1, 1, 2, 3]); // false

知识点:

  • Set 对象:允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
    • Set对象是值的集合,你可以按照插入的顺序迭代它的元素。Set 中的元素只会出现一次,即 Set 中的元素是唯一的。
    • NaNundefined 都可以被存储在 Set 中,NaN 之间被视为相同的值(NaN 被认为是相同的,尽管 NaN !== NaN

    • 实例属性:
    • Set.prototype.size:返回 Set 对象中的值的个数。

    • 实例方法:
    • Set.prototype.add(value):在Set对象尾部添加一个元素。返回该 Set 对象。
    • Set.prototype.clear():置空Set对象
    • Set.prototype.delete(value):删除Set对象中指定的value
    • Set.prototype.entries():返回一个Set对象的迭代器对象,生成类似Map对象的结构[[value, value],[value, value]],格式如下图;
    • Set.prototype.forEach(callbackFn(item, thisArg)):按照插入顺序,为 Set 对象中的每一个值调用一次 callBackFn。如果提供了thisArg参数,回调中的 this 会是这个参数。
    • Set.prototype.has(value):是否存在value值
    • Set.prototype.values():返回一个新的迭代器对象,但是生成的新对象跟之前Set对象的一样[value, value],与entries区别主要在生成对象的结构。
    • Set.prototype.keys():values() 方法的别名。



检查所有数组元素是否基于函数唯一(用函数处理过后是否还唯一)

  • 使用 Array.prototype.map()arr 数组中的每个元素都执行一下 fn 四舍五入函数。
  • 创建 Set 对象使数组里面的值不在重复保留唯一值。
  • 使用 Array.prototype.lengthSet.prototype.size 将唯一值数组的长度与原始数组进行比较。
const allUniqueBy = (arr, fn) => arr.length === new Set(arr.map(fn)).size;
allUniqueBy([1.2, 2.4, 2.9], Math.round); // true
allUniqueBy([1.2, 2.3, 2.4], Math.round); // false



根据给定属性按字母顺序对对象数组进行排序。

  • 使用 Array.prototype.sort() 根据给定的属性对数组进行排序。

  • 使用 String.product.localeCompare() 比较每个属性的值。


const alphabetical = (arr, getter, order = 'asc') =>

arr.sort(

order === 'desc'

? (a, b) => getter(b).localeCompare(getter(a))

: (a, b) => getter(a).localeCompare(getter(b))

);


const people = [ { name: 'John' }, { name: 'Adam' }, { name: 'Mary' } ];

alphabetical(people, g => g.name);

// [ { name: 'Adam' }, { name: 'John' }, { name: 'Mary' } ]

alphabetical(people, g => g.name, 'desc');

// [ { name: 'Mary' }, { name: 'John' }, { name: 'Adam' } ]

知识点

  • Array.prototype.sort():默认按照unicode位点也就是UTF-16编码排序(比如80在9之前)

  • Array.prototype.sort(compareFn):compareFn是指定按某种顺序进行排列的函数,按照这个函数排序

  • compareFn(a, b),return大于 0,b 会被排列到 a 之前。

  • a:第一个用于比较的元素

  • b:第二个用于比较的元素

  • String.prototype.localeCompare(compareString):如果引用字符串(string)存在于比较字符串(compareString)之前则为负数;如果引用字符串存在于比较字符串之后则为正数;相等的时候返回 0。(小于就是负数,大于就是正数)

  • 所以说localeComparesort是绝配,因为sort只判断是否大于0,解决了localeCompare不同浏览器返回的数字可能不同的问题。




检查两个参数是否为true真。

  • 使用逻辑与 (&&) 运算判断两个值是否为真.


const and = (a, b) => a && b;


and(true, true); // true

and(true, false); // false

and(false, false); // false

知识点

  • &&优先级大于