iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0
自我挑戰組

利用30分鐘~想一個前端問題系列 第 20

利用30分鐘~想一個前端問題 Day20-orderBy

  • 分享至 

  • xImage
  •  

orderBy

Returns a sorted array of objects ordered by properties and orders.

Uses Array.prototype.sort(), Array.prototype.reduce() on the props array with a default value of 0, use array destructuring to swap the properties position depending on the order passed. If no orders array is passed it sort by 'asc' by default.

基本上就是做陣列的排序,
按照對象屬性和排序規則,排序對象陣列。
1.使用 Array.sort()自定義排序規則排序,根據傳入的order  

如果沒有傳入的參數order 默認為asc。

const orderBy = (arr, props, orders) =>
  [...arr].sort((a, b) =>
    props.reduce((acc, prop, i) => {
      if (acc === 0) {
        const [p1, p2] = orders && orders[i] === 'desc' ? [b[prop], a[prop]] : [a[prop], b[prop]];
        acc = p1 > p2 ? 1 : p1 < p2 ? -1 : 0;
      }
      return acc;
    }, 0)
  );
EXAMPLES
const users = [{ name: 'fred', age: 48 }, { name: 'barney', age: 36 }, { name: 'fred', age: 40 }];
orderBy(users, ['name', 'age'], ['asc', 'desc']); // [{name: 'barney', age: 36}, {name: 'fred', age: 48}, {name: 'fred', age: 40}]
orderBy(users, ['name', 'age']); // [{name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}]

記憶點:

1.解構賦值
在物件解構賦值中,冒號前是用來對應物件的屬性名稱,冒號後才是真正建立的變數名稱和被賦值的對象

let obj = {
  website: "tommy",
  country: "Taiwan"
}

let {website, country} = obj;
console.log(website);  // tommy"
console.log(country);  // Taiwan

2.Array.sort()

可以發現 Array 上的 sort 方法是可以接受一個回調函數

function compare(a, b) {
  if (在某排序標準下 a 小於 b) {
    return -1;
  }
  if (在某排序標準下 a 大於 b) {
    return 1;
  }
  // a 必須等於 b
  return 0;
}

回調函數 就是一個排序規則 分為三種:

  • a排在b前面
  • a排在b後面
  • ab位置不動
if (a < b) {
   return -1;
}
// 如果有兩數 a b
// 當 a 小於 b 的時候
// 幫我把 a 排在 b 前面

if (a > b) {
    return 1;
}
// 如果有兩數 a b
// 當 a 大於 b 的時候
// 幫我把 a 排在 b 的後面
// a 此時等於 b
return 0;
// 回傳零代表不改變彼此之間的順序
// 當我們想要由小往大
arr.sort((a,b)=>a-b);
// 當我們想要由大至小
arr.sort((a,b)=>b-a);

上一篇
利用30分鐘~想一個前端問題 Day19-arrayToCSV
下一篇
利用30分鐘~想一個前端問題 Day21-allEqual
系列文
利用30分鐘~想一個前端問題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言