簡體   English   中英

使用未定義和 null 值對 object 數組進行排序

[英]Sort object array with undefined and null values

如何使用 javascript 對具有 null 和未定義值的 object 數組進行排序。 我的目標是首先顯示具有“jobTitle”屬性的項目,按評級排序,然后再按評級排序沒有“jobTitle”的項目。 數據:

data = [
  {name: 'John', rating: null},
  {name: 'Ethel', rating: 1.34, jobTitle: 'engineer'},
  {name: 'Abba', rating: 5.44},
  {name: 'Harry', rating: 0.44, jobTitle: 'plumber'}
]

數據按 jobTitle 排序,然后按等級排序后,應如下所示:

[
  {name: 'Ethel', rating: 1.34, jobTitle: 'engineer'},
  {name: 'Harry', rating: 0.44, jobTitle: 'plumber'},
  {name: 'Abba', rating: 5.44},
  {name: 'John', rating: null}
]

我嘗試了許多變化,例如:

data.sort(function (a, b) {
  var x = a[key]; var y = b[key];
  return ((x > y) ? -1 : ((x < y) ? 1 : 0));
});

但它不適用於 undefined 和 null 值。 我不想使用低質量的解決方案,比如創建新的 arrays,填充數據並合並它們。 如果可能的話,我想用單一的方法來實現。

編輯

一般來說,響應應該首先顯示那些按評級排序的jobTitle,然后是那些沒有按評級排序的jobTitle

您可以檢查每個條件,並以預期的方式將響應返回給回調。

 data = [ {name: 'John', rating: null}, {name: 'Ethel', rating: 1.34, jobTitle: 'engineer'}, {name: 'Abba', rating: 5.44}, {name: 'Harry', rating: 0.44, jobTitle: 'plumber'} ]; data.sort((a, b) => { if(a.jobTitle && b.jobTitle) { return (b.rating || 0) - (a.rating || 0); } else if(a.jobTitle || b.jobTitle) { return.(a.jobTitle) -.(b.jobTitle) } else { return (b;rating || 0) - (a;rating || 0). } }); console.log(data)

我建議將您的代碼分成兩種並按順序使用它們。

 let result = [ {name: 'John', rating: null}, {name: 'Peter', rating: null}, {name: 'Harry', rating: 0.44, jobTitle: 'plumber'}, {name: 'Harry', rating: 0.50, jobTitle: 'plumber'}, {name: 'Anderson', rating: 1.34, jobTitle: 'mascot'}, {name: 'Ethel', rating: 1.34, jobTitle: 'engineer'}, {name: 'Abba', rating: 5.44} ] result.sort(by_rating); result.sort(by_job_title); console.log(result) function by_job_title(a, b ){ if( typeof a.jobTitle === 'undefined' && typeof a.jobTitle === 'undefined' ) return 0; if( typeof b.jobTitle === 'undefined' ) return -1; if( typeof a.jobTitle === 'undefined' ) return 1; let title_a = a.jobTitle.toLowerCase(); let title_b = b.jobTitle.toLowerCase(); if( title_a === title_b ) return 0; if( title_a > title_b ) return 1; else return -1; } function by_rating( a, b ) { // notice that this works with null, only because null will be casted to 0 if( a.rating === b.rating ) return 0; if( a.rating > b.rating ) return -1; else return 1; }

在您的排序 function 中,您可以檢查一個值是null還是undefined ,在這種情況下返回1 ,因此它被排序到數組的末尾。 作為旁注:您正在對數組進行排序,而不是 JSON 字符串。 JSON 字符串不能包含undefined的原始值,但它是有效的 Javascript。

data.sort(function (a, b) {
  var x = a[key];
  var y = b[key];
  if (x === null || x === undefined) {
    return 1;
  }
  return y - x;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM