使用其他数组对数组对象进行排序

时间:2019-09-30 09:20:11

标签: javascript node.js lodash

无法根据给定的数组对数组对象进行排序 你能帮我吗!

reference link

const data = [ {
    parent_email: 'testuser@mailinator.com',
    childSurName: null,
    childFirstName: null,
    id: 22},
{
    parent_email: 'p20@mailinator.com',
    childSurName: null,
    childFirstName: 'Sachidanand',
    id: 31},
{
    parent_email: 'aa@aa.aaa',
    childSurName: null,
    childFirstName: null,
    id: 26}];

const order = [ 31,26 ];

const sorted = data.sort((a, b) => (
     order.indexOf(a.id)  - order.indexOf(b.id)
));

console.log(sorted)

我需要像第二个数组一样进行排序的结果,然后在其他数据之后:

 [ {
    parent_email: 'p20@mailinator.com',
    childSurName: null,
    childFirstName: 'Sachidanand',
    id: 31},
 {
    parent_email: 'aa@aa.aaa',
    childSurName: null,
    childFirstName: null,
    id: 26}
{
    parent_email: 'testuser@mailinator.com',
    childSurName: null,
    childFirstName: null,
    id: 22},
];

但是我得到的结果是没有得到正确的排序数据:

[{
    parent_email:"testuser@mailinator.com",
    childSurName:null,
    childFirstName:null,
    id:22
 },
 {
    parent_email:"p20@mailinator.com",
    childSurName:null,
    childFirstName:"Sachidanand",
    id:31
 },
 {
    parent_email:"aa@aa.aaa",
    childSurName:null,
    childFirstName:null,
    id:26
 }]

3 个答案:

答案 0 :(得分:2)

您可以在Map内使用Mapplace values along with priority,然后进行排序

注意:-另外,不要忘记保持搜索值和键的类型相同

const data = [{parent_email: 'testuser@mailinator.com',childSurName: null,childFirstName: null,id: 22},{parent_email: 'p20@mailinator.com',childSurName: null,childFirstName: 'Sachidanand',id: 31},{parent_email: 'aa@aa.aaa',childSurName: null,childFirstName: null,id: 26}];

const order = ['31', '22'];
const mapper = new Map(order.map((v, i) => [parseInt(v), i + 1]))

const sorted = data.sort((a, b) => (
  (mapper.get(a.id) || Infinity) - (mapper.get(b.id) || Infinity)
));

console.log(sorted)

答案 1 :(得分:0)

const sorted = data.sort((a, b) => order.indexOf(a.id.toString()) - order.indexOf(b.id.toString()) );

id必须转换为toString

或者,更改

 const order = [ '31','22' ];

 const order = [ 31,22 ];

答案 2 :(得分:0)

问题是由于ID 22引起的。它在order数组中不存在,并且indexOf函数为此ID返回-1。这意味着top priority,因此它出现在结果数组的第一位。 您应该处理order数组中不存在的ID。 例如(用于排序),您可以执行以下操作:

const sorted = data.sort((a, b) => {
    let aindex = order.indexOf(a.id);
    let bindex = order.indexOf(b.id);
    if(aindex === -1) return 1;
    if(bindex === -1) return -1;
    return aindex  - bindex;
});