【问题标题】:Order array of object by another array of object in javascript通过javascript中的另一个对象数组对对象数组进行排序
【发布时间】:2019-02-23 06:32:36
【问题描述】:

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

这是我的代码:

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'
    }
]

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

谢谢

【问题讨论】:

标签: javascript arrays sorting object


【解决方案1】:

由于您的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);

【讨论】:

    【解决方案2】:

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

    或者您可以使用下面的简单行使其适合您。这样就可以了。

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

    我只是在您的 orderItem 上运行 mapfinding arrayItem 上的相应对象,然后返回 来自您的 arrayItem 的对象。

    希望对你有帮助..

    【讨论】:

      【解决方案3】:

      您可以使用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);

      【讨论】:

        猜你喜欢
        • 2021-11-20
        • 1970-01-01
        • 2019-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多