01:判断数组每一项都符合某个条件
实现:采用Array.prototype.every()即可完成
const all = (arr, fn = Boolean) => arr.every(fn);
测试
all([4, 2, 3], x => x > 1); // true all([1, 2, 3]); // true
02:判断数组至少有一项都符合某个条件
实现:
const any = (arr, fn = Boolean) => arr.some(fn);
测试
any([0, 1, 2, 0], x => x >= 2); // true any([0, 0, 1, 0]); // true
03:将数组分成2组
实现
const bifurcate = (arr, filter) => arr.reduce((acc, val, i) => (acc[filter[i] ? 0 : 1].push(val), acc), [[], []]);
测试
bifurcate(['beep', 'boop', 'foo', 'bar'], [true, true, false, true]); // [ ['beep', 'boop', 'bar'], ['foo'] ]
04:统计数组,满足某个条件
实现
const countBy = (arr, fn) => arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val) => { acc[val] = (acc[val] || 0) + 1; return acc; }, {});
测试
countBy([6.1, 4.2, 6.3], Math.floor); // {4: 1, 6: 2} countBy(['one', 'two', 'three'], 'length'); // {3: 2, 5: 1}
05:比较2个数组差异
实现
const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); };
测试
difference([1, 2, 3], [1, 2, 4]); // [3]
06:按条件比较2个数组差异
实现
const differenceBy = (a, b, fn) => { const s = new Set(b.map(fn)); return a.map(fn).filter(el => !s.has(el)); };
测试
differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); // [1] differenceBy([{ x: 2 }, { x: 1 }], [{ x: 1 }], v => v.x); // [2]