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
。这是整个数组唯一符合顺序的属性。