如何根据id和名称对对象数组进行排序



我要根据name,receiver_id,sender_idrole_id对以下数组进行排序

this.role_id = 3
this.Data = [
{receiver_id: 3,sender_id:4,name: 'john',},
{receiver_id: 4,sender_id:3,name: 'james'},
{receiver_id: 2,sender_id:3,name: 'jane'},
{receiver_id: null,sender_id:null,name: 'charles'},
{receiver_id: null,sender_id:null,name: 'aaron'},
{receiver_id: 2,sender_id:4,name: 'alex'},
{receiver_id: 3,sender_id:2,name: 'david'},
];

我希望数组对象与receiver_id == role_idsender_id == role_id是在数组的顶部,它也应该按字母顺序。这样的

this.Data = [
{receiver_id: 3,sender_id:2,name: 'david'},
{receiver_id: 4,sender_id:3,name: 'james'},
{receiver_id: 2,sender_id:3,name: 'jane'},
{receiver_id: 3,sender_id:4,name: 'john'},
{receiver_id: null,sender_id:null,name: 'aaron'},
{receiver_id: 2,sender_id:4,name: 'alex'},
{receiver_id: null,sender_id:null,name: 'charles'},
];

现在我只能根据名字

排序
let colName = 'name'
this.Data.sort((b, a) => a[colName] < b[colName] ? 1 : a[colName] > b[colName] ? -1 : 0)

如何做到这一点?

将条件考虑到函数中可能会有所帮助。vip表示对象满足数值试验。另一个关键思想是vip相同性默认为alpha排序。这样我们就得到了vip和非vip之间的alpha排序。

let role_id = 3
let data = [
{receiver_id: 3,sender_id:4,name: 'john',},
{receiver_id: 4,sender_id:3,name: 'james'},
{receiver_id: 2,sender_id:3,name: 'jane'},
{receiver_id: 2,sender_id:4,name: 'alex'},
{receiver_id: 3,sender_id:2,name: 'david'},
];
function diff(a, b) {
const vip = obj => (role_id === obj.receiver_id) || (role_id === obj.sender_id)
const vipA = vip(a), vipB = vip(b)
return vipA === vipB ? a.name.localeCompare(b.name) : (vipA ? -1 : 1)
}
console.log(data.sort(diff))

使用排序方法,您确定项目A在其他(B)之前或之后。首先,您需要根据您的描述定义优先级,我猜:

1º:receiver_id == role_id || sender_id == role_id,按字母顺序排序

2º:receiver_id != role_id &&= role_id,按字母顺序排列

就是:

this.Data.sort( (a, b) => {
let conditionForA = a.receiver_id == role_id || a.sender_id == role_id;
let conditionForB = b.receiver_id == role_id || b.sender_id == role_id;
if (conditionForA && !conditionForB) {
// A > B
return 1;
}
if (conditionForB && !conditionForA) {
// B > A
return -1;
}
// For now A = B, let's compare alphabetically
if (a.name > b.name) return 1;
else if (a.name < b.name) return -1;
return 0; //equal
});

你可以尝试这样做:

this.Data.filter(a => (a.receiver_id === 3 || a.sender_id === 3))
.sort((b, a) => a.name < b.name ? 1 : a.name > b.name ? -1 : 0)
.concat(
this.Data.filter(a => !(a.receiver_id === 3 || a.sender_id === 3))
.sort((b, a) => a.name < b.name ? 1 : a.name > b.name ? -1 : 0))

首先,我们只过滤那些满足条件receiver_id == role_id || sender_id == role_id的条目,然后按名称对它们进行排序。

对不满足条件的项做同样的处理。最后,我们将两个结果数组连接起来。

您可以先按照它们的"sender_id"然后对它们进行迭代并按字母顺序排序。请注意,下面的代码并不完美,可能可以编写得更高效。

的例子:

function sort(array) {
// returns function if array is undefined or empty
if(!array) return;
let finalList = [];
let swapped = false;
do {
swapped = false;
for(let i = array.length - 1; i > 0; i--) {
if(array[i].sender_id < array[i - 1].sender_id) {
let temp = array[i];
array[i] = array[i - 1];
array[i - 1] = temp;
swapped = true;
}
} 
} while (swapped);
// sorts alphabetic
let lastBucket = [];
let lastId = 1;
for(entry in array) {
if(array[entry].sender_id > lastId) {
lastId = array[entry].sender_id;
let swapped = false;
do {
swapped = false;
for(let i = lastBucket.length - 1; i > 0; i--) {
if(lastBucket[i].name < lastBucket[i - 1].name) {
let temp = lastBucket[i];
lastBucket[i] = lastBucket[i - 1];
lastBucket[i - 1] = temp;
swapped = true;
}
}
for (item in lastBucket) {
finalList.push(lastBucket[item]);
}
lastBucket = [];
} while(swapped);
}
lastBucket.push(array[entry]);
}
for(item in lastBucket) {
finalList.push(lastBucket[item]);
}
return finalList;

}
// Test data
const sampleArray = [
{
sender_id: 1,
name: "test"
},
{
sender_id: 3,
name: "abc"
},
{
sender_id: 2,
name: "acd"
},
{
sender_id: 1,
name: "qqqqq"
},
{
sender_id: 9,
name: "hello world"
},
{
sender_id: 1,
name: "abc"
}
]
let sorted = sort(sampleArray);

最新更新