ES6 고급 팁 (필터 논문을 감소)

주 요약

갈처럼, 그것에서, 그래픽 알고리즘과 함수형 프로그래밍 시나리오, 우리가 지금 배우고있는이 현재 상태로 유용해야하는지 여러 번 있지만, 관심을 발견했을 때 Echarts 사용자 정의 요구 사항을 작성하는 요즘 노래, 아마도 일상에서 사용하는 미래의 일에

나는 단지 나에게 삶의 임금을 줄 수없는 일을 배우고 싶은

지금 파악 있도록 열정은 특정 연령이있을 것, 열정의 상실은 삶의 기쁨을 잃는 것과 같습니다

나는 약 전에 몇 번 쓴 reduce기사지만, 연속성이 없을 수 있습니다 또는 사용자 정의 시간을 필요로 결제 Echarts에 몇 일 전, 단일 없다는 것을, 마지막으로 우리는 경기장의 조합을 발견

필터도 부담 결국, 나는 또한 덜 사용 소개

특성을 감소

[1,2,3,4,4].reduce((acc,val)=>
                  //第一种
                   acc.concat(xxx),[]
                   //第二种
                   (acc.push(xxx),acc),[]
                   //第三种 单个值
                   acc+xxx,0
                   //第四种,如果是字符串
                   acc+xxx,''
                   //第五种,对象
                   acc[val]=xxx,{}
                  )
最普通的格式
[xxx].reduce((acc,val)=>{
    操作
    return acc
},[])
第一个参数是函数,第二个参数是格式,0/{},[],''

注意当使用concat应该直接return
[1,2,3,4,[1,2,3]].reduce((acc,val)=>{
  return acc.concat(val)
},[])

['beep', 'boop', 'foo', 'bar'], [true, true, false, true]

//简单的例子
let arr1 = [1, 2, 3, 4, 5];
let arr2 = [1, 0, 1, 0, 1];

第一种方法
    let arr3 = [];
    for (let i in arr2) {
      if (arr2[i]) {
        arr3.push(arr1[i])
      }
    }
    console.log(arr3);

第二种方法
arr1.reduce((acc, item, index) =>
            ( arr2[index] && acc.push(item), acc)
            , []);

观察特点   
(acc,val,i)=>(操作,acc)   最后返回的是acc
[]   Array.from({length:0})
[[],[]]   
有没有想过用 Array.from来实现
Array.from({length:2}).map(v=>[])
    我们可以知道
    length的值不可能是死的
    如果二维的数组可以是  
    length:Math.max(...arr.map(x=>x.length))

그 첫 글자 'B'의 수를 포함하는 경우 상기 어레이의 각 천공 선택되어

let arr = ['beep', 'boop', 'foo', 'bar'];
console.log(arr.reduce((acc, val) => (val[0] === 'b' && acc.push(val), acc), []));

进阶   每个数是否含有'b'
arr.reduce((acc, val) => 
           (val.indexOf('b') >-1 && acc.push(val), acc),
           [])

연산량

计算一个数组中某值的次数
[1, 2, 3, 4, 1, 1, 1, 1, 2, 3, 4].reduce(
  (acc, val) => val === 1? acc + 1 : acc, 0,
)
细节解读
0代表从0开始,acc是迭代的值,默认为0

console.log(['one', 'two', 'three','one', 'two', 'three'].reduce((acc, val) =>
  (acc[val] = (acc[val] || 0) + 1, acc), {},
));

细节解读
 (acc[val] = (acc[val] || 0) + 1
  第一次进入的时候 acc[val] 肯定是不存在的所以默认给0,后面给值了就叠加了
  
升级理解
  计算长度的次数
  console.log(['one', 'two', 'three', 'one', 'two', 'three'].map(v => v.length).reduce(
  (acc, val) =>
    (acc[val] = (acc[val] || 0) + 1, acc), {},
));

평면 배열

连接两个数组用concat方法
[1, 2, 3, 4, 5, [1, 3, 4], 5].reduce((acc, val) =>
  acc.concat(val),[]
);

const flatter=(arr,depth=1)=>
  arr.reduce((acc,val)=>
    acc.concat(depth>1&&Array.isArray(val)?flatter(val,depth-1):val),[]
  );
console.log(flatter([1,[2,3,4,[2,3,4,[1,2,3]]]],3));
// 细节 
&&  做判断
递归注意是把改变后的值作为参数再次传入函数

배열에 숫자의 위치를 ​​찾기

let arr = [1, 2, 3, 4, 1, 2, 1, 3, 1];
arr.reduce((acc, val, i) =>
  (val === 2 && acc.push(i), acc), [],
);

문자열 조작

需求在数组的偶数项或者奇数项插入特定的字符
['pen', 'pineapple', 'apple', 'pen'].reduce(
  (acc, val, i) =>
    i % 2 === 0 ?
      acc + val + '我'
      : acc + val + '你'
  , '',
); //pen我pineapple你apple我pen你

가장 긴의 배열 해당 항목의 모든 일을 반환

['this', 'is', 'a', 'testcase'].reduce(
  (acc, val) => 
        (acc.length > val.length ? acc : val), 0,
)

// 求和
[1,2,3,4,5].reduce(
    (acc,val)=>acc+val,0
)

두 배열은 하나의 객체로 결합

let arr1 = [1, 2, 3];
let arr2 = arr1.map(v => v * 3);
arr1.reduce((acc, val, i) =>
  (acc[val] = arr2[i], acc), {},
);
// { '1': 3, '2': 6, '3': 9 }

고차 함수 중첩 줄일

객체의 복수의 어레이로 그룹화 될 수있다

const partition = (arr, fn) =>
  arr.reduce(
    (acc, val, i, arr) => {
      acc[fn(val, i, arr) ? 0 : 1].push(val);
      return acc;
    },
    [[], []]
  );
const users = [{ user: 'barney', age: 36, active: false }, { user: 'fred', age: 40, active: true }];
partition(users, o => o.active); // [[{ 'user': 'fred',    'age': 40, 'active': true }],[{ 'user': 'barney',  'age': 36, 'active': false }]]

用普通函数定义变量
    arr.reduce((acc, val) => {
      let a = val.age;
      acc[a ? 0 : 1].push(val);
      return acc
    },[[],[]]);

전환 위치의 복소 배열 (임시 이해 기본 로직 및 다른 종래 기술은 다시 보존 용액을 개선하기 위해)

[1,2,3] =>  每两个数之间交换位置,递归,遍历
首先判断当数组是两个数,两个数之间交换位置
const permutations = arr => {
  if (arr.length <= 2) return arr.length === 2 ? [arr, [arr[1], arr[0]]] : arr;
  return arr.reduce(
    (acc, val, i) => {
      //就是这块合并,分解,再遍历
      return acc.concat(
        permutations([...arr.slice(0, i), ...arr.slice(i + 1)])
          .map(item => [val, ...item]),
      );
    }, [],
  );
};
console.log(permutations([1, 2, 3, 4]));

이 배열은 다음 선택 속성의 삭제 된 개체 삭제에서 선택

const data = [
  {
    id: 1,
    name: 'john',
    age: 24
  },
  {
    id: 2,
    name: 'mike',
    age: 50
  }
];
let obj = ['id', 'name'];
data.filter(v=>v.age>24)
    .map(item=>
         obj.reduce((acc,val)=>(acc[val]=item[val],acc),{}))

정렬 구현 감소

// 升序
[0,1,2,3].reduce((acc,val)=>acc-val>=0?acc:val);
//降序
[0,1,2,3].reduce((acc,val)=>val-acc>=0?acc:val);

오브젝트 특성들의 어레이 드 경량화

let arr = [
  {id: 0, value: 'a'},
  {id: 1, value: 'b'},
  {id: 2, value: 'c'},
  {id: 1, value: 'd'},
  {id: 0, value: 'e'},
];
fn=(a,b)=>a.value===b.value;

console.log(arr.reduce((acc, val) => {
  if (!acc.some(x => fn(val, x))) acc.push(val);
  return acc
}, []));
//[ { id: 0, value: 'a' },
//   { id: 1, value: 'b' },
//   { id: 2, value: 'c' },
//   { id: 1, value: 'd' },
//   { id: 0, value: 'e' } ]

각 어레이의 배열을 복수의 별개로 분할

const unzip = arr =>
  arr.reduce(
    (acc, val) => (val.forEach((v, i) => acc[i].push(v)), acc),
    Array.from({
      length: Math.max(...arr.map(x => x.length))
    }).map(x => [])
  );

unzip([['a', 1, true], ['b', 2, false]]); // [['a', 'b'], [1, 2], [true, false]]

필터

배열을 제거 자체의 수를 반복하지 않는다

let arr=[1,3,3,4,4,5,6];
arr.filter((v,i,array)=>array.indexOf(v)==array.lastIndexOf(v))

let arr = [1, 2, 3, 1, 2, 5];
const fn = (a, b) => a === b;
console.log(arr.filter((v, i) => arr.every((w, j) => (j === i) === fn(w, v))));

동일하거나 상이한 필터를 선택할 수

//第一种方式
let arr1 = [1, 2, 3, 4, 5];
let arr2 = [1, 0, 1, 0, 1];
console.log(arr1.filter(v => !arr2.includes(v)));

//第二种形式
const intersection = (a, b) => {
  const s = new Set(b);
  return a.filter(x => s.has(x));
};

intersection([1, 2, 3], [4, 3, 2]); // [2, 3]

//第三种形式
a中不存在b中的数
let arr1 = [1, 3, 4, 5, 6, 7,6,6,7,7,20];
let arr2 = [3, 4, 5, 8, 9, 20, 12];
console.log(arr1.filter(v => arr2.findIndex(w => w === v) === -1));

如果是小数可以先进行处理再比较
let arr1 =  [1, 1.2, 1.5, 3, 0];
let arr2 = [1.9, 3, 0, 3.9];
console.log(arr1.filter(v => arr2.findIndex(w => Math.round(w)=== Math.round(v)) === -1));

.................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. ......................

추천

출처www.cnblogs.com/fangdongdemao/p/10991051.html