【问题标题】:Sorting an array based on property value of another array of objects根据另一个对象数组的属性值对数组进行排序
【发布时间】:2019-08-04 12:06:35
【问题描述】:

假设我有一个对象数组:

var list = [
       { name: "A", distance: 1},
       { name: "B", distance: 2},
       { name: "C", distance: 3},
       { name: "D", distance: 4},
       { name: "E", distance: 5},
       { name: "F", distance: 6},
       { name: "G", distance: 7},
       { name: "H", distance: 8} 
    ];

如果我有另一个像这样的数组:

var disturbed = ["G", "B", "C", "F"];

如何根据distance propertylist arraydisturbed array 进行排序,如下所示:

["B", "C", "F", "G"];

编辑:我试过这段代码没有成功:

items = [ 
       { name: "A", distance: 1},
       { name: "B", distance: 2},
       { name: "C", distance: 3},
       { name: "D", distance: 4},
       { name: "E", distance: 5},
       { name: "F", distance: 6},
       { name: "G", distance: 7},
       { name: "H", distance: 8}
]

sorting = [ 1, 2,3,4,5,6,7,8,9,10 ];
result = []
for (let i = 0; i < items.length; i++){
sorting.forEach(function(key) {
    var found = false;
    items = items.filter(function(item) {

        if(!found && items[i].distance == key) {
            result.push(item);
            found = true;
            return false;
        } else 
            return true;
    })
})

result.forEach(function(item) {
    document.writeln(item[i]) 
})
}

如何根据另一个对象数组的属性值对数组进行排序

【问题讨论】:

标签: javascript


【解决方案1】:

您可以使用.reduce()list数组更改为对象,然后根据该对象进行排序。

演示:

var list = [
       { name: "A", distance: 1},
       { name: "B", distance: 2},
       { name: "C", distance: 3},
       { name: "D", distance: 4},
       { name: "E", distance: 5},
       { name: "F", distance: 6},
       { name: "G", distance: 7},
       { name: "H", distance: 8} 
    ];
    
var disturbed = ["G", "B", "C", "F"];
    
var sort = list.reduce((acc, cur) => {
  acc[cur.name] = cur.distance;
  return acc;
}, {});

disturbed.sort((a, b) => sort[a] - sort[b]);

console.log(disturbed)

【讨论】:

    【解决方案2】:

    您可以使用sort 方法来做到这一点

    var list = [
           { name: "A", distance: 1},
           { name: "B", distance: 2},
           { name: "C", distance: 3},
           { name: "D", distance: 4},
           { name: "E", distance: 5},
           { name: "F", distance: 6},
           { name: "G", distance: 7},
           { name: "H", distance: 8} 
        ];
    
    var disturbed = ["G", "B", "C", "F"];
    
    disturbed.sort((a, b) => {
        var itemA = list.find(item => item.name === a);
        var itemB = list.find(item => item.name === b);
        return itemA.distance - itemB.distance;
    });
    
    disturbed.forEach(function(item) {
        document.writeln(item[i]) 
    })
    

    【讨论】:

      【解决方案3】:

      您可以使用.find() 查找具有指定name 属性且与distributed 中的元素匹配的对象。一旦你得到这个,你就可以得到距离属性并计算差异以进行相应的排序:

      const list = [
        { name: "A", distance: 1},
        { name: "B", distance: 2},
        { name: "C", distance: 3},
        { name: "D", distance: 4},
        { name: "E", distance: 5},
        { name: "F", distance: 6},
        { name: "G", distance: 7},
        { name: "H", distance: 8} 
      ];
      
      const disturbed = ["G", "B", "C", "F"];
      
      const res = disturbed.sort((a, b) => {
        const {distance: d_a} = list.find(({name}) => name === a);
        const {distance: d_b} = list.find(({name}) => name === b);
        return d_a - d_b;
      });
      
      console.log(res);

      更有效的方法是使用.map() 创建new Map,然后在地图上的键上使用.sort()

      const list = [
        { name: "A", distance: 1},
        { name: "B", distance: 2},
        { name: "C", distance: 3},
        { name: "D", distance: 4},
        { name: "E", distance: 5},
        { name: "F", distance: 6},
        { name: "G", distance: 7},
        { name: "H", distance: 8} 
      ];
      const disturbed = ["G", "B", "C", "F"];
      
      const lut = new Map(list.map(({name, distance}) => [name, distance]));
      const res = disturbed.sort((a, b) => lut.get(a) - lut.get(b));
      console.log(res);

      【讨论】:

      • .findsort 中的效率非常低,例如 O(log n² * n²)
      • @JonasWilms 是的,我同意这不是很有效。我本来打算建议一个更好的方法,但 Cuong Le Ngoc 提供了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 2016-06-02
      • 1970-01-01
      相关资源
      最近更新 更多