用JavaScript中的另一个对象数组对对象数组进行排序

时间:2018-09-19 06:53:11

标签: javascript arrays sorting object

如何通过另一个对象数组对对象数组进行排序。

这是我的代码:

let arrayItem = [
    {
        'id': '#id1',
        'name': 'one',
        'bundle': 'bundle1'
    },
    {
        'id': '#id2',
        'name': 'two',
        'bundle': 'bundle2'
    },
    {
        'id': '#id3',
        'name': 'three',
        'bundle': 'bundle3'
    }
]

这是要订购的数组:

let orderItem = [
    {
        'id': '#id3',
        'name': 'three'
    },
    {
        'id': '#id1',
        'name': 'one',
    },
    {
        'id': '#id2',
        'name': 'two'
    }
]

我需要以下数据:

let resultItem = [
    {
        'id': '#id3',
        'name': 'three',
        'bundle': 'bundle3'
    },
    {
        'id': '#id1',
        'name': 'one',
        'bundle': 'bundle1'
    },
    {
        'id': '#id2',
        'name': 'two',
        'bundle': 'bundle2'
    }
]

我想通过多个键将对象数组与另一个对象数组排序。

谢谢

3 个答案:

答案 0 :(得分:2)

由于orderArray中有对象数组,因此首先需要找到该顺序对象的索引,然后获取index的差值以对原始数组进行排序:

let arrayItem = [
    {
        'id': '#id1',
        'name': 'one',
        'bundle': 'bundle1'
    },
    {
        'id': '#id2',
        'name': 'two',
        'bundle': 'bundle2'
    },
    {
        'id': '#id3',
        'name': 'three',
        'bundle': 'bundle3'
    }
];

let orderItem = [
    {
        'id': '#id3',
        'name': 'three'
    },
    {
        'id': '#id1',
        'name': 'one',
    },
    {
        'id': '#id2',
        'name': 'two'
    }
];
arrayItem.sort(function(a, b){
  var aIndex = orderItem.findIndex(({id, name}) => a.id===id && a.name===name);
  var bIndex = orderItem.findIndex(({id, name}) => b.id===id && b.name===name);
  return aIndex - bIndex;
});
console.log(arrayItem);

答案 1 :(得分:0)

您可以按照@Ankit Agarwal的建议使用排序

或者您可以使用下面的简单行使其适合您。这可以解决问题。

var orderedItem = orderItem.map(orderObj => 
       arrayItem.find(actualObj => actualObj.id === orderObj.id))
  

我刚刚在您的 orderItem 上运行mapfind    arrayItem 上的对应对象,然后返回   您的arrayItem中的对象。

希望有帮助。

答案 2 :(得分:0)

您可以使用Map来存储索引/顺序,然后使用索引的差量对数组进行排序。

var arrayItem = [{ id: '#id1', name: 'one', bundle: 'bundle1' }, { id: '#id2', name: 'two', bundle: 'bundle2' }, { id: '#id3', name: 'three', bundle: 'bundle3' }],
    orderItem = [{ id: '#id3', name: 'three' }, { id: '#id1', name: 'one', }, { id: '#id2', name: 'two' }],
    order = new Map(orderItem.map(({ id }, i) => [id, i]));
    
arrayItem.sort((a, b) => order.get(a.id) - order.get(b.id));

console.log(arrayItem);