转圈圈

Array

Array.prototype.every()

  • 对每个值做判断,全部满足返回true,否则返回false
const all = (arr,fn=Boolean) => arr.every(fn);

all([1,2,3,4]) // true
all([1,2,3,4,""]) // false
all([1,2,3,4,5],item => item > 3)  // false
  • 检查每个值是否相等
const allEqual = arr => arr.every(item => item === arr[0]);

allEqual([1,'2','1',2]) // false
allEqual([NaN,NaN]) //  false

Array.prototype.some()

  • 有符合条件的就返回 true
const any = (arr,fn=Boolean) => arr.some(fn);

Array.prototype.map()

  • 把二位数组转换为字符串
const ArrayToString = (arr,dilimiter) => {
  return arr
            .map(item => item.join(dilimiter))
            .join(dilimiter);
};
const ArrayToString = (arr,dilimiter) => arr.map(item => item.join(dilimiter)).join(dilimiter);

Array.prototype.reduce()

  • 分组 bifurcate
// 三目运算,reduce
const bifurcate = (arr,filter) => arr.reduce((acc,item,index) =>{acc[filter[index]?0:1].push(item);return acc;},[[],[]]);

// 常规
function group(arr,filter) {
  const result = [[],[]];
  filter.forEach((item,index) => {
    item?result[0].push(arr[index]):result[1].push(arr[index]);
    // if(item){
    //   result[0].push(arr[index]);
    // }else {
    //   result[1].push(arr[index]);
    // }
  })
  return result;
}
  • bifurcateBy
const bifurcateBy = (arr, fn) => arr.reduce((acc, item, index) => { acc[fn(item) ? 0 : 1].push(item); return acc; }, [[],[]]);
  • count
const count = (arr,value) => arr.reduce((acc,item) => item === value?acc+1:acc,0)
  • [1,2,3,4,5,6,2,1,100] 找出数组中的最大值
// 方法一 遍历数组
const array_max = arr => arr.reduce((acc,item) =>item>acc?acc = item:acc ,-Infinity)

const arr = [-1,-2,-3,-4,-5,-6,-7];

array_max(arr)  // -1

// 方法二  Math.max() tips:参数长度有限制
const max = Math.max.apply(null,arr)  //  -1

// 方法三 先排序,取出最后一个
const array_sortMax = arr => {
  return arr.sort((x,y) =>x-y )[arr.length-1];
}


Array.prototype.from()

  • 把数组分割成指定大小
// 把数组分割成指定大小
const chunk = (arr, size) =>
  Array.from({ length: Math.ceil(arr.length / size) }, (v, i) =>
    arr.slice(i * size, i * size + size)
  );
  • 随机生成一个指定大小,指定范围的数组
function randomArray(min,max,length) {
  return Array.from({length:length},item => item =  getRandomIntInclusive(min,max));
}

// 生成min -max之间的随机数 [min,max)
function getRandomInt(min,max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random()*(max-min) + min);
}


// 生成min -max之间的随机数 [min,max]
function getRandomIntInclusive(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值 
}

Array.prototype.filter()

// 返回 真值
const filter_falsey = arr => arr.filter(Boolean);
  • 从两个数组中导出没有重复的值(arr1,arr2)
// 写法一 Set.has()
const diff = (arr1,arr2) => {
  const set = new Set(arr1);

  return arr2.filter(item =>!set.has(item) );
}

// 写法二 Array.includes()
const diffArray = (arr1,arr2) => {
  // 排除arr1 里面的重复值
  const set = [...new Set(arr1)];

  // 此处不能用indexOf(),indexOf判断不了NaN
  return arr2.filter(item => !set.includes(item));

}


const arr2 = [1,2,3,4,5,null,NaN,undefined,""],
      arr1 = [1,2,3,4,6];

console.log(
  diff(arr1,arr2), // [ 5, null, NaN, undefined, '' ] 
  diffArray(arr1,arr2),  //  [ 5, null, NaN, undefined, '' ]
)
  • 传入函数,遍历处理,再返回不一样的值(arr1,arr2,fn)
const diffBy = (ar1,arr2,fn) => {
  const set = new Set(arr1.map(fn));
  return arr2.map(fn).filter(item => !set.has(item))
}


const arr1 = [1,7,9,3,4],
      arr2 = [7,8,9,10];

console.log(
  diffBy(arr1,arr2,item => item+10 )  //  [ 18, 20 ]
  
)

Array.prototype.concat()

  • 多维数组,转换为一维数组
// 递归
const deepFlatten = arr => [].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)));

//  数组转换为字符串,字符串转换为数组
const fn = arr => arr.join().split(',');

// 例子
let arr = [1, 2, [3, 4, 5, [1, 2, 3, 4, 5, 6]]];

console.log(
  deepFlatten(arr),  // [ 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6 ] 
  fn(arr),  // [ '1', '2', '3', '4', '5', '1', '2', '3', '4', '5', '6' ]
)

  • 拼接数组
let arr1 = [1,2,3,4],
    arr2 = [5,6,7,8];

arr1.concat(arr2);   // 返回新的数组 [1, 2, 3, 4, 5, 6, 7, 8]
[].push.apply(arr1,arr2) //  改变原数组arr1   arr1 [1, 2, 3, 4, 5, 6, 7, 8]
[...arr1,...arr2] //  [1, 2, 3, 4, 5, 6, 7, 8]

原文:

posted @ 2019-05-18 10:16  rosendolu  阅读(206)  评论(0编辑  收藏  举报