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

Javascript 如何根据id和名称对对象数组进行排序,javascript,arrays,typescript,Javascript,Arrays,Typescript,我想根据名称、接收者id、发送者id和角色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

我想根据
名称
接收者id
发送者id
角色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\u id==role\u id
sender\u id==role\u 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)
让colName='name'
this.Data.sort((b,a)=>a[colName]b[colName]?-1:0)

如何做到这一点?

使用排序方法,您可以确定一个项目A是在另一个项目(B)之前还是之后。首先,您需要根据您的描述定义优先级,我想:

1º:按字母顺序排列的项目,其中接收者_id==角色| |发送者_id==角色_id

2º:接收器id!=角色\u id&&sender\u id!=角色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.sort((a,b)=>{
设conditionForA=a.receiver_id==role_id | | a.sender_id==role_id;
设conditionForB=b.receiver_id==role_id | | b.sender_id==role_id;
if(conditionForA&!conditionForB){
//A>B
返回1;
}
if(conditionForB&!conditionForA){
//B>A
返回-1;
}
//现在A=B,让我们按字母顺序进行比较
如果(a.name>b.name)返回1;
否则如果(a.name
这可能有助于将条件分解为函数
vip
表示对象满足数值测试。另一个关键思想是vip相似性默认为alpha排序。通过这种方式,我们可以在VIP和非VIP之间获得alpha排序

让角色\u id=3
让数据=[
{接收者id:3,发送者id:4,姓名:'john',},
{接收者id:4,发送者id:3,姓名:'james'},
{接收者id:2,发送者id:3,姓名:'jane'},
{接收者id:2,发送者id:4,姓名:'alex'},
{接收者id:3,发送者id:2,姓名:'david'},
];
功能差异(a,b){
const vip=obj=>(角色_id==obj.receiver_id)| |(角色_id==obj.sender_id)
常数vipA=vip(a),vipB=vip(b)
返回vipA==vipB?a.name.localeCompare(b.name):(vipA?-1:1)
}

console.log(data.sort(diff))
您可以尝试以下方法:

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))
this.Data.filter(a=>(a.receiver_id==3 | | a.sender_id==3))
.sort((b,a)=>a.nameb.name?-1:0)
康卡特先生(
this.Data.filter(a=>!(a.receiver_id==3 | | a.sender_id==3))
.sort((b,a)=>a.nameb.name?-1:0))
首先,我们只过滤那些满足条件的条目,然后按名称对它们进行排序

对于不满足条件的条目,我们也会这样做。
最后,我们将两个结果数组连接起来。

您可以先将它们排序在“发件人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);
函数排序(数组){
//如果数组未定义或为空,则返回函数
如果(!数组)返回;
设finalList=[];
让交换=假;
做{
交换=假;
对于(设i=array.length-1;i>0;i--){
if(数组[i]。发送方\u id<数组[i-1]。发送方\u id){
设temp=array[i];
数组[i]=数组[i-1];
数组[i-1]=温度;
交换=真;
}
} 
}while(交换);
//按字母排序
设lastBucket=[];
设lastId=1;
for(数组中的条目){
if(数组[entry]。发送者\u id>lastId){
lastId=array[entry]。发件人\u id;
让交换=假;
做{
交换=假;
对于(设i=lastBucket.length-1;i>0;i--){
if(lastBucket[i].name
但所需的输出不是按字母顺序排列的?它是按顺序排列的,实际上,所需结果中接收方id=3或发送方id=3的对象位于顶部。首先是id,然后是字母表。它的顺序是
sender\u id
。这是整个数组唯一符合顺序的属性。