代码之家  ›  专栏  ›  技术社区  ›  Akhilesh

根据不同对象的等级对对象数组进行排序

  •  -2
  • Akhilesh  · 技术社区  · 7 年前

    我有一个对象数组如下。

    var options = [
      {value: 'b', label: "test1"},
      {value: 'a', label: "test12"},
      {value: 'c', label: "test123"}
    ]
    

    以及下面的一系列等级。

    var ranks = [
      {rank: 1, value: "a"},
      {rank: 2, value: "b"},
      {rank: 3, value: "c"}
    ]
    

    现在我需要整理一下 options 根据 rank 中的属性 ranks 数组

    3 回复  |  直到 7 年前
        1
  •  0
  •   Nikhil Aggarwal    7 年前

    要降低复杂性并提高性能,可以首先创建 temp 对象/地图 具有 key obj.value rank value . 然后简单地使用 Array.sort 根据临时对象中存储的等级进行排序。

    let options = [{value: 'b', label: "test1"},{value: 'a', label: "test12"},{value: 'c', label: "test123"}];
    let ranks = [{rank: 1, value: "a"},{rank: 2, value: "b"},{rank: 3, value: "c"}]; 
    
    let temp = ranks.reduce((a,c) => Object.assign(a,{[c.value]:c.rank}), {});
    options.sort((a,b) => temp[a.value] - temp[b.value]);
    console.log(options);
        2
  •  1
  •   qiAlex    7 年前

    var options = [
      {value: 'b', label: "test1"},
      {value: 'a', label: "test12"},
      {value: 'c', label: "test123"}
    ]
    
    
    var ranks = [
      {rank: 1, value: "a"},
      {rank: 2, value: "b"},
      {rank: 3, value: "c"}
    ]
    
                 
    options.sort((a, b) => {
      return ranks.find(_ => _.value === a.value).rank - ranks.find(_ => _.value === b.value).rank
    })
    
    console.log (options)
        3
  •  1
  •   Nina Scholz    7 年前

    使用ES6,您可以使用 Map

    var options = [{ value: 'b', label: "test1" }, { value: 'a', label: "test12" }, { value: 'c', label: "test123" }],
        ranks = [{ rank: 1, value: "a" }, { rank: 2, value: "b" }, { rank: 3, value: "c" }];
        
    options.sort(
        (m => ({ value: a }, { value: b }) => m.get(a) - m.get(b))
        (ranks.reduce((m, { rank, value }) => m.set(value, rank), new Map))
    );
    
    console.log(options);