【问题标题】:Sort an array based on multiple objects' value根据多个对象的值对数组进行排序
【发布时间】:2019-12-30 16:18:29
【问题描述】:

我有一个如下所示的数组:

  { username: 'usernameadw',
    rank: 'rookie',
    points: 891
  },
  { username: 'username662',
    rank: 'rookie',
    points: 999
  },
  { username: 'usernameabd8a',
    rank: 'knight',
    points: 2393
  },
  { username: 'usernamev88',
    rank: 'mage',
    points: 1673
  },
  { username: 'abcusername123',
    rank: 'mage',
    points: 1483
  }

我想知道如何将这些数组拆分为“mageArray”、“knightArray”、rookieArray 等数组,然后对每个数组按每个对象从高到低的点数对它们进行排序?

到目前为止,我已尝试使用此代码,但它不起作用。我试图做的是从带有信息的大数组中创建一个新对象,然后如果等级名称匹配,则将其推送到另一个数组

var obj = new Object({
            username: usersRows[i].username,
            rank: usersRows[i].rank,
            points: usersRows[i].points
          });

if (usersRows[i].rank === 'mage') { mageArray.push(obj); }

【问题讨论】:

标签: javascript arrays node.js


【解决方案1】:

首先让我们使用以下方法将主数组分解为三个子数组:

var users = [{ username: 'usernameadw',
    rank: 'rookie',
    points: 891
  },
  { username: 'username662',
    rank: 'rookie',
    points: 999
  },
  { username: 'usernameabd8a',
    rank: 'knight',
    points: 2393
  },
  { username: 'usernamev88',
    rank: 'mage',
    points: 1673
  },
  { username: 'abcusername123',
    rank: 'mage',
    points: 1483
  }];

  var rookieArray = [];
  var knightArray = [];
  var mageArray = [];

  // split users into category arrays.
  for (i=0; i<users.length; i++) {

      if (users[i].rank === 'rookie') {
        rookieArray.push(users[i]);
      }

      if (users[i].rank === 'knight') {
        knightArray.push(users[i]);
      }

      if (users[i].rank === 'mage') {
        mageArray.push(users[i]);
        }      
  }

一旦我们有了它,我们只需要使用带有比较函数的 array.sort 进行数字排序,如下所示:

// sort the rookies array
  rookieArray.sort(function(a, b) {
    return b.points - a.points;
  });

  knightArray.sort(function(a, b) {
    return b.points - a.points;
  });

  mageArray.sort(function(a, b) {
    return b.points - a.points;
  });

这里有一个关于 for 循环的好参考:https://www.w3schools.com/js/js_loop_for.asp

array.sort 的一个很好的参考在这里: https://www.w3schools.com/js/js_array_sort.asp

【讨论】:

  • 如果添加了新类型,应该添加更多行
【解决方案2】:

试试这个。

const usersRows = [{
    username: 'usernameadw',
    rank: 'rookie',
    points: 891
},
{
    username: 'username662',
    rank: 'rookie',
    points: 999
},
{
    username: 'usernameabd8a',
    rank: 'knight',
    points: 2393
},
{
    username: 'usernamev88',
    rank: 'mage',
    points: 1673
},
{
    username: 'abcusername123',
    rank: 'mage',
    points: 1483
}];


function makeSortMap(usersRows) {
    const sortMap = {};
    for(row of usersRows) {
        const key = row.rank;
        if(!sortMap[key]) {
            sortMap[key] = [];
        }

        sortMap[key].push(row);
    }

    for(r in sortMap) {
        sortMap[r].sort((a, b) => b.points - a.points);
    }

    return sortMap;
}

makeSortMap(usersRows);

排序参考:Sorting object property by values

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2018-08-16
    • 2017-02-23
    • 2017-09-29
    • 2021-04-26
    • 1970-01-01
    • 2018-11-01
    • 2014-05-29
    • 1970-01-01
    相关资源
    最近更新 更多