Lodash 筆記

各種組合技紀錄

Posted by Lil Toby on Tuesday, March 5, 2019

Outline

情境用法

字串拿掉

```javascript
const text = "azertyazerty";
const result = _.replace(text, /az/g, "qu");
```
  • 找尋 array 是否存在這個item > 回傳boolean

    • _.includes(<array>,<欲判斷的item>)

把一個 array 裡的重複項拿掉

  • _.uniqBy(data, 'id');

要比對兩個array, 拿掉重複到的?

```javascript
const excludeSelected = _.reduce(
  <array2>, _.reject, <array1>
);
```

要篩出兩個array一樣的部分

  • _.intersection(<array1>,<array2>)

要比對兩個陣列拿掉重複到的items ?

  • _.difference(<arr1>, <arr2>)
  • 注意是掃描 arr1 裡遇到 arr2 有的就拿掉

某個 array 篩掉有符合 {key:value} 的 items

是有符合條件的 “一群” - _.filter(<array>, _.match({"key":"value"}))

#加總某陣列

- `_.reduce`

從某array刪除東西

- `_.pullAt(arr , [1,3,4])`
- 代表拿掉 index 為 1, 3, 4 的item
- 是 side effect 所以原本的 array 會被動到

#更新陣列中某item

const newArr = arr.map((a) => {
    a.id === 1 ? {id: 1, name: "Person New Name"} : a
);

#把某陣列依序塞進某巢狀obj裡

const finalSloSource = {
    ...sloSource,
    service: _.zipObject(["namespace", "kind", "name"], arr),
};
  • 等於把 array 的值依序塞進 sloSource.service 成為 namespacr, kind, name的value

注意

  • _.find(<array>, <object>)
    • 只能返回 “一個符合的item”
    • (而且還是第一個遇到的就抓!)

相似比較

  • _.without vs _.reject
    • 都可以從array裡剔除相符條件的item
    • _.without是要完全符合,item一模模一樣樣才會拿掉,較嚴謹
    • _.reject比較寬鬆,只要有符合就可以拿掉

比對前後台的obj

- `_.omit` 消減 v.s. `_.pick` 抓取符合的
- 用 `_.pick`會比較好

組合技

  • 更新array裡面某個match到的item
    • 比對的obj不一樣
      • _.map(state.apps, d => ( d.app_id === action.basicInfo.app_id ? _.extend({}, d, action.basicInfo) : d )),
    • 比對的obj一樣 (直接replace,適合拿response來比對)
      • _.map(state.apps, d => (d.app_id === action.data.app_id ? action.data : d)),

方法說明

  • _.map(array,callback)

    • 針對array依序做callback的動作回傳,最後return新的array
    • 如果callback放某個key的名字,則會列出”key符合”的item陣列
  • _.isEqual

    • 判斷兩個obj的內容是否一樣 (相較於 === & !== 比較寬鬆)
    • if(_.isEqual(<obj1>, <obj2>))
    • const object = { ‘a’: 1 }; const other = { ‘a’: 1 };

      _.isEqual(object, other); // => true

      object === other; // => false

  • _.find(array,<相符的物件 or callback>)

    • 找陣列裏相符的obj並回傳
    • _.find(users, function(o) { return o.age < 40; }); _.find(users, { ‘age’: 1, ‘active’: true });
  • _.omit(<指定obj>,<要拿掉的key值組成的array>)

    • 從object中濾掉某些值
    • const object = { ‘a’: 1, ‘b’: ‘2’, ‘c’: 3 }; _.omit(object, [‘a’, ‘c’]); // => { ‘b’: ‘2’ }
  • _.flatMap

    • 依序對array執行function後再全部concat起來
    • _.flatMap(array, <callback>);
    • function duplicate(n) { return [n, n]; } _.flatMap([1, 2], duplicate); // => [1, 1, 2, 2]
  • _.reduce

    • 一個一個執行callback並持續累計至某個值
  • _.every vs _.some

  • _.cloneDeep

    • 深層的複製某個object
  • _.random(15, 20);

    • 產出在這區間隨機一個數字
  • _.assign(,,)

    • 擴充object們,有點像concat,但前面會被後面的覆蓋
  • _.times(<次數>, );

    • 重複執行x次callback,有點像for迴圈的感覺
  • _.keys()

    • 把全部keys都抓到然後重組成陣列
  • _.pick(,)

    • 將物件裡對應到keys的item們抓出來
    • => object
  • _.setWith(object, ‘[0][1]‘, ‘a’, Object);

    • 生成一個巢狀的陣列
      • arg3: 代表巢狀依序指定的key
      • arg3: 要給最深那層指定的值
    • 最後_.clone是指說每一層都深層clone的意思

      >>>> 舉例
      return _.setWith(
      { ...state },
      "forms.microservices.$form.options",
      flattenResourcesData(action.payload.namespaces),
      _.clone,
      );
      
      >>>> 結果
      {
      ...state,
      forms:{
          ...state.froms,
          microservices:{
              ...state.froms.microservices,
              $form:{
                  options: < payload裡接到經過flatten的資料 >
              }
          }
      }
      }
      
  • - 請 Toby 喝珍奶,你請我就喝 🥤 -

    Lil Toby Blog

    YA~大杯還小杯~看你誠意 ❤ ️

    使用手機掃描 QRCODE 完成 pay 下去