用多个条件排序对象

时间:2017-03-30 16:03:44

标签: javascript sorting reactjs if-statement redux

我目前正在尝试对我的reducer中返回的对象数组进行排序。我想根据正在返回的name对应用进行排序,目前仍有一些null名称,我想在最后列出null名称。目前,当我尝试添加其他条件时,我收到错误Cannot read property 'toLowerCase' of null我希望null项只需要将它们移动到最后。

// Actions
export const FETCH_MYAPPS_PENDING = 'widgets/apps/FETCH_PENDING';
export const FETCH_MYAPPS_FULFILLED = 'widgets/apps/FETCH_FULFILLED';

// Reducer
const appsSort = (a, b) => {
  if (a.name != null && b.name != null) {
   if (a.name.toLowerCase() > b.name.toLowerCase()) return 1;
   if (a.name.toLowerCase() < b.name.toLowerCase()) return -1;
  }
  return 0;
};

export default function reducer(state = { data: [], pending: false }, action) {
switch (action.type) {
case FETCH_MYAPPS_FULFILLED:
  return {
    data: action.apps.sort(appsSort),
    pending: false,
    retrievedAt: Date.now(),
  };
case FETCH_MYAPPS_PENDING:
  return {
    ...state,
    pending: true,
  };
default:
  return state;
 }
}

3 个答案:

答案 0 :(得分:1)

我的尝试。它在顶部稍微多余,但在检查名称之前进行空检查是有意义的。

    const appsSort = (a, b) => {
      //null checks
      if (a.name === null && b.name === null) return 0;
      if (a.name === null && b.name !== null) return 1;
      if (b.name === null && a.name !== null) return -1;
      //check for lowercase
      if (a.name.toLowerCase() > b.name.toLowerCase()) return 1;
      if (a.name.toLowerCase() < b.name.toLowerCase()) return -1;
      return 0;
    };
    
    var obj = [
      {name: 'apples', id: 1},
      {name: null, id: 3},
      {name: 'Banana', id: 2},
      {name: null, id: 4}
    ]
    
    obj.sort(appsSort);
    
    console.log(obj)

答案 1 :(得分:1)

您可以使用null检查作为排序值,稍后使用localeCompare进行排序,并使用链式方法logical OR ||进行排序。

const appsSort = (a, b) =>
        (a.name === null) - (b.name === null) ||
        ('' + a.name).localeCompare(b.name);
    
var obj = [{ name: 'apples', id: 1 }, { name: null, id: 3 }, { name: 'Banana', id: 2 }, { name: null, id: 4 }];
    
obj.sort(appsSort);
    
console.log(obj)

答案 2 :(得分:0)

该错误表明a.nameb.name无法解析为使用方法toLowerCase的对象。

在尝试对它们调用toLowerCase之前,您可以确保两者的值都是字符串。这是检查值是否为&#39;字符串&#39;

的一种方法
typeof a.name === 'string'