目录
- 根据函数检查数组元素是否相等
- 检查数组所有元素是否是唯一值
- 检查所有数组元素是否基于函数唯一(用函数处理过后是否还唯一)
- 根据给定属性按字母顺序对对象数组进行排序。
- 检查两个参数是否为
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.length和Set.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 中的元素是唯一的。
NaN和undefined都可以被存储在 Set 中,NaN 之间被视为相同的值(NaN 被认为是相同的,尽管NaN !== NaN)
- 实例属性:
Set.prototype.size:返回 Set 对象中的值的个数。
- 实例方法:
Set.prototype.add(value):在Set对象尾部添加一个元素。返回该 Set 对象。Set.prototype.clear():置空Set对象Set.prototype.delete(value):删除Set对象中指定的valueSet.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.length和Set.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。(小于就是负数,大于就是正数) -
所以说
localeCompare和sort是绝配,因为sort只判断是否大于0,解决了localeCompare不同浏览器返回的数字可能不同的问题。
检查两个参数是否为true真。
-
使用逻辑与 (
&&) 运算判断两个值是否为真.
const and = (a, b) => a && b;
and(true, true); // true
and(true, false); // false
and(false, false); // false
知识点:
- &&优先级大于