[英]How can I sort an array of objects by 3 fields with conditions and null values always come last
[英]Sort null values to last in Array of Objects
我有一個對象數組如下:
c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]
我希望通過具有值的對象,然后是具有null的對象來對它們進行排序。
我嘗試的是:
c.sort(function(b) { return b.a ? -1 : 1 })
OUTPUT
[{a: 2}, {a: 50}, {a: 1}, {a: 12}, {a: null}, {a: null}]
預期輸出
[{a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}, {a: null}]
我怎樣才能做到這一點?
這會將空值和其他虛假值放在列表的末尾:
c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]; c.sort((x, y) => !!ya - !!xa); console.log(c);
但是,由於您沒有真正排序任何內容,您可以將列表拆分為兩部分並重新加入它們:
c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]; r = [ ...c.filter(x => xa !== null), ...c.filter(x => xa === null) ] console.log(r)
這也不依賴於sort
函數是穩定的。
你可以測試一下這個值。 如果為null
,則采用比較的delta。
var c = [{ a: null }, { a: 12 }, { a: 1 }, { a: 50 }, { a: 2 }, { a: null }]; c.sort(function (a, b) { return (aa === null) - (ba === null); }); console.log(c);
.as-console-wrapper { max-height: 100% !important; top: 0; }
對於穩定排序,您可以使用map進行排序,並使用索引作為第二個排序選項。
// the array to be sorted var list = [{ a: null }, { a: 12 }, { a: 1 }, { a: 50 }, { a: 2 }, { a: null }]; // temporary array holds objects with position and sort-value var mapped = list.map(function(el, i) { return { index: i, value: el.a === null}; }); // sorting the mapped array containing the reduced values mapped.sort(function(a, b) { return a.value - b.value || a.index - b.index; }); // container for the resulting order var result = mapped.map(function(el){ return list[el.index]; }); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
那樣 ?
c=[{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}];
c.sort(function(a,b){ return a.a===null ? 1:-1 })
console.log(c);
編輯
const c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]; let result = [...c.filter(_=>_["a"]!==null),...c.filter(_=>_["a"]===null)]; console.log(result);
var c = [{ a: null }, { a: 12 }, { a: 1 }, { a: 50 }, { a: 2 }, { a: null }]; c.sort(function(a, b) { return (aa !== null) ? 0 : 1; }); console.log(c);
在sort函數中返回0
將保持順序不變。
如果compareFunction(a,b)返回0,則保持a和b相對於彼此保持不變,但是對於所有不同的元素進行排序。
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
嘗試return !aa - !ba
有效對象先行
var c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]; c.sort(function (a, b) { return !aa - !ba }); console.log(c);
這不完美,但仍然有效,歡呼!
var c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}] c.sort(function(object1,object2){ if(object1.a === null && object2.a !== null){return 1} if([object1.a,object2.a].every((a)=>a === null) || [object1.a,object2.a].every((a)=>a !== null) ){return 0} if(object1.a !== null && object2.a === null){return -1} }) console.log(c);
以下是如果存在,則在末尾對Date值進行排序的情況:
userSortList = users.sort((a, b) => {
if (b.lastConnectionDate === null || a.lastConnectionDate) {
return -1
} else {
return (
new Date(b.lastConnectionDate) - new Date(a.lastConnectionDate)
)
}
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.