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

排列数组的元素

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

    我在一个函数上,它给数组的每个元素排序。 我已经写了一个很好的函数。

    var list = [
      {val:10},
      {val:15},
      {val:7},
      {val:21}
      ]
    
    var fun = function (list){
    var accum = 1;
    list.map(e => {
              e.pos = accum;
              accum++;
              return e;
          });
          list.sort((a,b) => {
            if(a.val > b.val)
                return -1;
            if(a.val < b.val)
              return 1;
            return 0
          });
          accum = 1;
          list.map(e => {
              e.rank = accum;
              accum++;
              return e;
          });
          list.sort((a,b) => {
              if(a.pos > b.pos)
                return 1;
              if(a.pos < b.pos)
                return -1;
              return 0
          });
          
          return list;
    }
    console.log(fun(list));

    有没有其他方法来编写函数而不是进行四次迭代?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Nina Scholz    7 年前

    你可以把这些指数作为等级来分类。稍后生成一个新对象并将索引添加为秩。

    var list = [{ val: 10 }, { val: 15 }, { val: 7 }, { val: 21 }],
        ranks = Object.keys(list).map(Number).sort((a, b) => list[b].val - list[a].val),
        result = list.map(((o, i) => Object.assign({}, o, { pos: i + 1, rank: ranks.indexOf(i) + 1})));
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }
        2
  •  1
  •   Mihai Alexandru-Ionut    7 年前

    map 方法与 sort .

    slice list ,因为 分类 方法动作 .

    var list = [{val:10}, {val:15}, {val:7}, {val:21}]
    list_sorted = list.slice().sort((a,b) => b.val- a.val).map(a => a.val);
    list = list.map(function(item, i){
      return {val : item.val, pos : i + 1, rank : list_sorted.indexOf(item.val) + 1};
    });
    console.log(list);